本文使用的是AT32F403A的PB14和PB15来模拟IIC的时序,设置IO为复用开漏输出模式。
由于AT24C02的三个地址硬件上都是拉到地,所以地址为0xA0。
驱动软件部分就是通过对IO的拉高拉低,以及读取值等操作,实现iic的时序,包括开始时序,停止时序,ack、no ack、等待ack,发送时序,接收时序等,想要了解的可去看源码,同时此驱动代码是从雅特力官网获取的然后修改io部分。
初始化代码 - /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] i2c gpio initialization.
- * @param none.
- * @retval none.
- */
- void i2c_config(void)
- {
- gpio_init_type gpio_initstructure;
-
- /* i2c gpio clock enable */
- crm_periph_clock_enable(I2Cx_SCL_GPIO_CLK, TRUE);
- crm_periph_clock_enable(I2Cx_SDA_GPIO_CLK, TRUE);
-
- I2C_SDA_HIGH();
-
- I2C_SCL_HIGH();
-
- /* gpio configuration */
- gpio_initstructure.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
- gpio_initstructure.gpio_pull = GPIO_PULL_UP;
- gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
- gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
-
- /* configure i2c pins: scl */
- gpio_initstructure.gpio_pins = I2Cx_SCL_PIN;
- gpio_init(I2Cx_SCL_GPIO_PORT, &gpio_initstructure);
-
- /* configure i2c pins: sda */
- gpio_initstructure.gpio_pins = I2Cx_SDA_PIN;
- gpio_init(I2Cx_SDA_GPIO_PORT, &gpio_initstructure);
- }
驱动代码:
|