基础:
(1)I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps 公司开发的,是一条总线,上面可以挂在多个I2C设备实现通讯功能;
(2)一个I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL);
(3)各个设备都用自己的地址,来实现访问;
传输过程:
I2C 协议规定设备地址可以是7 位或10 位,7 位的地址应用比较广泛,紧跟设备地址的一个数据位用来表示数据传输方向,数据方向位(R/W); 1 :主机读从机数据,0:主机写数据到从机;
编写程序:EEPROM 为例:AT24C02的地址为:A2A1A0 都为0时,地址为:0b10010 000;
读写控制加上后 ,写:0x A0,读:0xA1;
(1) 配置通讯使用的目标引脚为开漏模式;
(2) 使能I2C 外设的时钟;
(3) 配置I2C 外设的模式、地址、速率等参数并使能I2C 外设;
(4) 编写基本I2C 按字节收发的函数;
(5) 编写读写EEPROM存储内容的函数;
(6) 编写测试程序,对读写数据进行校验。
主发送器的通讯过程下图所示:
主接收器过程:
编写程序的过程一定要满足上述过程;
(1)GPIO_InitTypeDef I2C_GPIO_Config()
(2)I2C_InitTypeDef; I2C_Mode_Config()
由于程序过程很长就先不源码分析了,可以参考野火的教程;
int main(void)
{
// LED config
Led_GPIO_config();
// exiti config
EXIT_Key_Config();
//systick config
SysTick_Iint();
// usart config
USART_Config();
// i2c eeprom at240c
I2C_EE_Init();
Usart_SendString(DEBUG_USARTx,"This is test for usart_debug \n开始...\n");
while(1)
{
printf(" i2c eeprom write test... \n");
Usart_SendString(DEBUG_USARTx,"LED3 亮\n");
LED3_ON;
Delay_10us(100000);
I2C_EE_ByetsWrite(writeData,0,8);
printf(" i2c eeprom writing finished \n");
LED3_OFF;
printf(" i2c eeprom read test... \n");
Delay_10us(100000);
I2C_EE_BufferRead(readData, 0,8);
printf(" i2c eeprom reading finished \n");
}
printf("\r\n 这是一个8Mbyte 串行flash(W25Q64)实验 \r\n");