下午好/晚上论坛用户,我需要帮助来了解如何在“Milandr” MDR32F9Q2的家用微控制器上对 I2C 接口进行编程。
接口初始化函数:
void I2C_init(void)
{
/*Настройка порта*/
MDR_RST_CLK->PER_CLOCK |= RST_CLK_PCLK_PORTC;
MDR_PORTC->FUNC &= ~(PORT_FUNC_MODE0_Msk
| PORT_FUNC_MODE1_Msk);
MDR_PORTC->FUNC |= (PORT_FUNC_ALTER << PORT_FUNC_MODE0_Pos
| PORT_FUNC_ALTER << PORT_FUNC_MODE1_Pos);
MDR_PORTC->ANALOG |= PORT_Pin_0
| PORT_Pin_1;
MDR_PORTC->PWR |= (PORT_SPEED_MAXFAST << PORT_PWR0_Pos
| PORT_SPEED_MAXFAST << PORT_PWR1_Pos);
/*Настройка I2C*/
MDR_RST_CLK->PER_CLOCK |= RST_CLK_PCLK_I2C; /*Включение тактирования*/
MDR_I2C->PRL = 0x27;
MDR_I2C->PRH = 0;
MDR_I2C->CTR |= (1 << I2C_CTR_EN_I2C_Pos) /*Включение приемопередатчика*/
| (0 << I2C_CTR_EN_INT_Pos) /*Запрет прерываний*/
| (0 << I2C_CTR_S_I2C_Pos); /*CLK до 400кГц*/
}
我用示波器检查了 SCL 线上的频率,当连续发送字节时,它是 ~ 400kHz(准确地说是 396kHz)。我写了一个从磁力计寄存器读取数据的小脚本:
I2C_Send7bitAddress(0x1C, I2C_Direction_Transmitter); /*Передача адреса магнитометра и бита записи*/
while(MDR_I2C->STA & I2C_STA_RX_ACK){}; /*Ожидание от слейва ACK бита*/
I2C_SendByte(0x00); /*Отправка номера регистра, который хочу считать*/
while(MDR_I2C->STA & I2C_STA_RX_ACK){}; /*Ожидание от слейва ACK бита*/
I2C_SendSTOP(); /*Отправка стоп-бита*/
I2C_Send7bitAddress(0x1C, I2C_Direction_Receiver); /*Передача адреса магнитометра и бита чтения*/
I2C_StartReceiveData(I2C_Send_to_Slave_NACK); /*Перевод микроконтроллера в режим чтения*/
while(MDR_I2C->STA & I2C_STA_RX_ACK){}; /*Ожидание от слейва ACK бита*/
while(MDR_I2C->STA & I2C_STA_TR_PROG) /*Пока передаются данные*/
{
temp[idx] = I2C_GetReceivedData(); /*Считать байт*/
idx++;
}
I2C_SendSTOP(); /*Отправка стоп-бита*/
似乎一切都是根据磁力计的数据表完成的,我附上了一张带有读取下面 1 个字节的算法的图
但是,我没有得到一个等于 0x48 的字节作为响应,而是得到一个由 35 个元素组成的数组,并且没有一个单元格具有所需的字节
第一个字节应该等于我与写入位 0x1C | 一起发送的值。0x00,后面4个值是读位为0x1C的地址| 0x01。鉴于我正在等待从机的确认位,为什么在读取时此数据仍保留在缓冲区中,我不明白。在此先感谢您的帮助