/* Master send address to slave. /
I2C_MasterStart(EXAMPLE_I2C_MASTER_BASEADDR, I2C_MASTER_SLAVE_ADDR_7BIT, kI2C_Write);
/ Enable module interrupt. */
I2C_EnableInterrupts(EXAMPLE_I2C_MASTER_BASEADDR, kI2C_GlobalInterruptEnable);
I2C_EnableInterrupts(EXAMPLE_I2C_SLAVE_BASEADDR, kI2C_GlobalInterruptEnable);
首先主机发送start信号,紧跟是从机ID信息和读写方向共八位,发送完之后从机状态寄存器IAAS位置位 从机获得地址匹配,导致从机机进入IRQ中断,从机进入中断首先清中断然后清C1_TX,C1_TXAK 使从机处于接收状态并使能ACK确认位;
主机状态寄存器TCF位置位 主机进入中断清中断,然后向数据寄存器写入值(TCF位清零)启动第一个字节的发送,完成发送后从机 TCF位置位 从机进入IRQ中断 清中断,从机读取数据寄存器的值完成第一个字节的传输;
(NOTE 在 函数I2C_MASTER_IRQHandler 中每次写入数据寄存器会g_masterTxIndex++ 但是并不会增加值 必须等待从机接收之后从新跳到这个位置来增加,因为一旦写入主机数据寄存器后从机立即接收并进入从机中断处理程序)
紧接着主机状态寄存器 TCF位置位主机进入中断并清中断,向主机寄存器写入新值(清TCF位)启动第二个字节的传输,从机状态寄存器TCF位置位,从机进入中断并清中断,读取从机数据寄存器(清TCF)然后重新进入主机中断处理程序执行“g_masterTxIndex++””;
主机项数据寄存器写入最后一个字节后,从机再次进入中断并清中断,从机控制寄存器1 TX位写1 发送NAK位,主机控制寄存器C1 MST写入0 发送stop信号停止传输
/* Disable module interrupt. */
I2C_DisableInterrupts(EXAMPLE_I2C_MASTER_BASEADDR, kI2C_GlobalInterruptEnable);
I2C_DisableInterrupts(EXAMPLE_I2C_SLAVE_BASEADDR, kI2C_GlobalInterruptEnable);