我现在用AT32F435VGT7读取一个传感器里的EEPROM数据,调试了好多天,发现这个芯片的I2C极不稳定,时而可以通信,时而不能通信,完全没有规律。用的是PB14/PB15,I2C3,I2C的时序配置用的是雅特力的Artery I2C Timing TooL配置的,外部上拉电阻用的是2K,配置数据如下:
I2C初始化如下:
void I2C3_config(void)
{
i2c_reset(I2C3); //复位I2C外设
gpio_init_type gpio_init_structure;
/*i2c外设时钟 */
crm_periph_clock_enable(CRM_I2C3_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
/*GPIO配置*/
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_4); //PB15 SCL
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_4); //PB14 SDA
/* 配置PB15 SCL*/
gpio_init_structure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_structure.gpio_mode = GPIO_MODE_MUX;
gpio_init_structure.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
gpio_init_structure.gpio_pull = GPIO_PULL_UP;
gpio_init_structure.gpio_pins = GPIO_PINS_15;
gpio_init(GPIOB, &gpio_init_structure);
/* 配置PB14 SDA */
gpio_init_structure.gpio_pins = GPIO_PINS_14;
gpio_init(GPIOB, &gpio_init_structure);
/*配置I2C3*/
i2c_init(I2C3, 0x00, 0x30F02745); //配置为300KHz,上拉2K电阻,上升时间300ns,下降时间8ns
i2c_enable(I2C3, TRUE); //使能I2C
}
用的是I2C_Application_Lib里的读写函数,函数入参配置如下:
i2c_status = i2c_memory_read(&hi2cx, I2C_MEM_ADDR_WIDIH_16, slaveAddr, startAddress, temp_table, 20,0xFFFFFFF);
当不能通信时,我检查了各项配置,发现i2c_memory_read这个函数里超时时间我设置的是500, 后来改成了上面的0xFFFFFFF, 和官方一样,重新烧录程序,可以通信了。但是过了一段时间又不行了,我个人认为这个超时时间500应该也没什么问题。现在所有设置基本和官方完全一样了,还是时好时坏,没有任何规律,非常不稳定。。
我还没有验证EEPROM的问题,但根据测试下来的感觉,EEPROM应该问题不大。
不知道这个I2C还要怎么配置?希望能帮助看一下是哪里的问题,谢谢
|