IIC--IIC广播功能的使用及应用
I²C广播(General Call)是一种通过全局地址(0x00)向总线上所有设备同时发送指令的核心协议功能,
其设计目标是实现对多从设备的同步控制。
CH32系列单片机均支持此功能,下面介绍此功能的使用。其基本配置代码参考我们EVT IIC中断例程即可
本次主要介绍核心部分。
主机:
I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 2. 发送广播地址 (0x00 | 写操作) I2C_Send7bitAddress(I2C1, 0x00, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // 3. 发送数据 for(uint8_t i=0; i<len; i++) { I2C_SendData(I2C1, data[i]); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); } // 4. 停止条件 I2C_GenerateSTOP(I2C1, ENABLE);
这样即完成一次主机的广播,其主要就是往为0的地址发数据。这样具备从机广播应答功能的从机均会应答。
从机:
I2C1->CTLR1 |= (1<<6);//在初始化时添加将此位,该位使能从机的IIC广播应答功能
//这段在IIC中断例程的中断里添加,
if( I2C_GetFlagStatus( I2C1, I2C_FLAG_GENCALL ) != RESET ) { printf("GENCALL\r\n"); printf("rx_data:%x\r\n",I2C_ReceiveData(I2C1)); }
这样主机发完地址后,每发一次广播的数据,均会进这里一次,在该中断里读取数据即可。
二,代码很简单,那么有哪些常见应用呢。
应用:
1,多设备同步启动/复位
2,多设备同步配置
如IIC通过总线广播发送配置信息,原先需要通过对应地址一个一个发,现在只需要发送一次,提高了效率。
3,多点传感器同步采集
如农业大棚中多个个DHT22同时启动温湿度采样,避免分时读取形成的“采样时间差”
4,多节点固件升级
原先一对一,现在设备同步接收到升级固件,可同步升级。
5,多从机地址分配
传统如果需要N多个从机协同工作,那么就需要准备N多套代码分别给设备下载,以实现不同地址的从机,
有了广播功能可通过代码逻辑实现主机给这N多个从机分配地址。