I2C是双线双向的同步串行总线,它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。I2C标准是一个具有冲突检测机制和仲裁机制的真正意义上的多主机总线,它能在多个主机同时请求控制总线时利用仲裁机制避免数据冲突并保护数据。
I2C 总线控制器,能满足 I2C 总线的各种规格并支持所有与 I2C 总线通信的传输模式。I2C 逻辑能自主地处理字节的传输。它能保持跟踪串行传送,而且还有一个状态寄存器(I2Cx_STAT)能反映 I2C 总线控制器和 I2C 总线的状态。
支持标准(100Kbps)/快速(400Kbps)/高速(1Mbps)三种工作速率。支持噪声过滤功能。支持广播地址。
i2c_int例程是读取eeprom,但是开发板上没有eeprom,所以这个例程就不讲解了。
i2c_master例程
本样例主要涉及I2C主机发送数据功能,需要配合i2c_slave和i2c_lpm进行通信测试。
- Gpio_SetFunc_I2CDAT_P15();
- Gpio_SetFunc_I2C_SCL_P14();
-
- Clk_SetPeripheralGate(ClkPeripheralI2c, TRUE);
-
- stcI2cCfg.enFunc = I2cBaud_En;
- stcI2cCfg.u8Tm = 0x04; // 1M波特率 100k=(4000000/(8*(4+1))
- stcI2cCfg.pfnI2cCb = NULL;
- stcI2cCfg.bTouchNvic = FALSE;
-
- I2C_DeInit();
- Gpio_InitIO(2, 3, GpioDirOut);
-
- I2C_Init(&stcI2cCfg);
- I2C_SetFunc(I2cHlm_En);
- I2C_SetFunc(I2cMode_En);
-
- while (1) {
- //查询方式
- Data = ~Data;
- Gpio_SetIO(2, 3, Data);
- I2C_MasterWriteData((u8DevAddr << 1), 0x00, &u8Senddata[0], 10);
- delay1ms(3000);
- }
首先配置i2c,然后在while中3s发送一次数据。
i2c_slave例程就是接收数据
- Gpio_SetFunc_I2CDAT_P35();
- Gpio_SetFunc_I2CCLK_P36();
-
- Clk_SetPeripheralGate(ClkPeripheralI2c, TRUE);
- Gpio_InitIO(2, 3, GpioDirOut);
- Gpio_SetIO(2, 3, 1);
-
- stcI2cCfg.enFunc = I2cBaud_En;
- stcI2cCfg.stcSlaveAddr.Addr = 0x20; //从机地址设置0x40
- stcI2cCfg.stcSlaveAddr.Gc = 0;
-
- stcI2cCfg.u8Tm = 0x04; // 100k波特率 100k=(4000000/(8*(4+1))
- stcI2cCfg.pfnI2cCb = I2cCallBack;
- stcI2cCfg.bTouchNvic = TRUE;
-
- I2C_DeInit();
-
- I2C_Init(&stcI2cCfg);
- I2C_SetFunc(I2cAck_En);
- I2C_SetFunc(I2cHlm_En);
- I2C_SetFunc(I2cMode_En);
回调函数
- static void I2cCallBack(void)
- {
- uint8_t pu8Data[20] = {0};
- uint32_t pu32Len;
- Gpio_SetIO(2, 3, 0);
- I2C_SlaveReadData(pu8Data, &pu32Len);
- delay1ms(100);
- Gpio_SetIO(2, 3, 1);
- }
读取数据并闪灯。
i2c_lpm例程与i2c_slave相同,只是让模块进入睡眠,通过i2c数据唤醒。
- //休眠模式测试
- while (1 == Gpio_GetIO(T1_PORT, T1_PIN))
- ;
- //注意:此处如果用户更改进入深度休眠模式,必须保证P02端口拉高,否则一上电就进入深度休眠模式,SWD连接不上。此代码为休眠模式而非深度休眠,所以不影响。
- Lpm_Config(&stcLpmCfg);
- Lpm_GotoLpmMode();
- Gpio_SetIO(2, 3, 0);