主题中讨论的其他器件:TM4C123
我的代码已成功使用 I2C 的轮询方法、与 MCP23017总线扩展器连接。 但是、由于一些时序问题、我要转到中断驱动的 I2C 通信来释放一些 CPU 时间。 我的代码基于为 SPMA073提供的源文件、此源文件可在 TI 网站上找到。 我意识到它是为 Tm4C129x 编写的、但我希望它适应 TM4C123。
我注意到的第一件事是、示例代码似乎使用的是16位寄存器地址、其中我只需要一个8位寄存器地址、因此我更正了该地址。 我可以在中断处理程序中设置断点、并查看是否发送寄存器地址和两个数据字节(寄存器地址0x00、数据为0x00和0x00、以将总线扩展器端口设置为输出。)
我还看到它从发送最后一个字节
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
然后、它会在下面代码的 while 循环中挂起。 它永远不会转换到 I2C_OP_STOP 状态。 请参阅底部的中断句柄中的片段。 有什么想法吗?
G_ui8MasterTxData[0]= 0x00;
G_ui8MasterTxData[1]= 0x00;
G_ui8MasterTxData[2]= 0x00;
G_ui8MasterBytesLength = 2;
//
//在中设置发送标志并设置页地址
//将外部从器件连接到0x0000
//
G_bI2CDirection = false;
G_registerAddress = 0x00;
G_ui16SlaveWordAddress = 0x0;
G_ui8MasterBytes = 0;
IntTrigger (INT_I2C0);
while (g_ui8MasterCurrent 状态!= I2C_OP_STOP);
G_ui8MasterCurrent 状态= I2C_OP_IDLE;
中断处理程序片段
I2C_OP_TXDATA 案例:
//
//将当前状态移动到上一状态
//否则继续传输直到最后一个字节
//
G_ui8MasterPrevState = g_ui8MasterCurrent 状态;
//
//如果地址或数据已经 NAK'ed,则转至停止状态
//如果由于获得的字节数而出现停止条件
//完成,然后移动到停止状态
//
if (ui32I2CMasterInterruptStatus & I2C_MASTER_INT_NACK)
{
G_ui8MasterCurrent 状态= I2C_OP_STOP;
}
否则、IF (ui32I2CMasterInterruptStatus 和 I2C_MASTER_INT_STOP)
{
G_ui8MasterCurrent 状态= I2C_OP_STOP;
}
其他
{
I2CMasterDataPut (I2C0_BASE、g_ui8MasterTxData[g_ui8MasterBytes++]);
if (g_ui8MasterBytes == g_ui8MasterBytesLength)
{
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
}
其他
{
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);
}
}
中断;