* 1. Enable peripheral clock using CLK_PeripheralClockConfig(CLK_Peripheral_I2Cx, * ENABLE) function (Refer to the product datasheet for the available I2C * peripherals) * * 2. Program the Mode, duty cycle , Own address, Ack, Speed and Acknowledged * Address using the I2C_Init() function...
i2c_clock_config(I2C0,I2C0_Frequence,I2C_DTCY_2); i2c_mode_addr_config(I2C0,I2C_I2CMODE_ENABLE,I2C_ADDFORMAT_7BITS,I2C0_OWN_Address); i2c_enable(I2C0); i2c_ack_config(I2C0,I2C_ACK_ENABLE); } ③读寄存器操作: void I2C0_Register_Read(uint8_t* B_buffer, uint8_t read_address,uin...
void I2C_init(uint32_t I2Cx){ GPIO_Configuration_I2C(I2Cx); i2c_clock_config(I2Cx, 400000, I2C_DTCY_2); /* I2C address configure */ i2c_mode_addr_config(I2Cx, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0); /* enable acknowledge */ i2c_ack_config(I2Cx, I2C_ACK_DISABLE); /...
首先需要将RV-STAR开发板及OLED显示屏参照下图使用杜邦线进行连线: 然后在IDE中进行代码编写,在使用I2C接口的时候,首先要对其进行初始化:先使能外设时钟,然后将SDA、SCL两个引脚配置为开漏模式,之后需要依次设置I2C的时钟速率、地址,然后使能I2C和ACK。其相关代码如下: voidI2C_Configuration(void){uint32_tGPIO_SDA,...
// 重新配置Ack使能,以便下次通讯 I2C_AcknowledgeConfig(EEPROM_I2C, ENABLE); } 接下来,就是硬件i2c要注意的几个地方。事实上,直接按如下代码操作,程序会直接卡死: int main(void) { uint8_t readData[10] = {0}; USART_config(); I2C_EE_config(); ...
i2c_mode_addr_config(I2C_BUS[i2c_id],I2C_I2CMODE_ENABLE,I2C_ADDFORMAT_7BITS,I2C_OWN_ADDRESS7); /* enable I2C0 */ i2c_enable(I2C_BUS[i2c_id]); /* enable acknowledge */ i2c_ack_config(I2C_BUS[i2c_id],I2C_ACK_ENABLE); }
对于接收接口,sdk1.2也提供了i2c_master_seq_receive这个API,从内部API可以看出是关闭自动响应,软件控制一次传输的ACK和NACK,避免STOP未出现时出现数据断开。 5验证功能 根据以上信息,我们来操作一个实验,以sdk的poll例子的master和slave两个开发板进行相互收发,slave不做改动,master的读写接口替换以上的接口。
I2C_AcknowledgeConfig(CW_I2C1,ENABLE);//读取数据超过1个字节才发送ACK } break; case 0x50: //接收完一字节数据,在接收最后1字节数据之前设置AA=0; u8Recdata[u8RecvLen++] = I2C_ReceiveData(CW_I2C1); if(u8RecvLen==READLEN-1) { I2C_AcknowledgeConfig(CW_I2C1,DISABLE);; ...
硬件I2C并不像网上大部分人认为的这么多坑,对硬件熟悉的话不会走太多弯路,大部分卡死估计主要是地址不对,对于st的例程,如果地址是错的或者没接,或者没上电,或者没选通,或者关断使能了等等可能只要有一种情况发生,slave就根本不会响应ack,那么主机就一直在等待中,估计很多人是掉这个坑里了。