Other Parts Discussed in Thread: MSP430FR5849
您好!
我正在尝试在 Driverlib 库上构建一些简单的例程、以便使用中断通过 I2C 通道发送和接收数据。
可用示例仅用于发送或接收、因此我尝试合并中断例程、但没有完全成功。
看起来 Tx 部分工作正常、但我也无法使接收部分工作。
这是我的中断例程:
#pragma vector=USCI_B0_vector __interrupt void USCIB0_ISR (void) { switch (_even_in_range (UCB0IV、0x1E) ){ case 0x00:break; //向量0:无中断中断; 情况0x02:中断; //向量2:ALIFG 中断; 大小写0x04: //向量4:NACKIFG 中断; EUSCI_B_I2C_masterSendMultiByteStop (EUSCI_B0_BASE); ptr = 0; break; case 0x06:break; //向量6:STT IFG 中断; 大小写0x08:中断; //向量8:STPIFG 中断; 大小写0x0a:中断; //向量10:RXIFG3中断; 大小写0x0c:中断; //向量14:TXIFG3中断; 大小写0x0E:中断; //向量16:RXIFG2中断; 大小写0x10:中断; //向量18:TXIFG2中断; 大小写0x12:中断; //向量20:RXIFG1中断; 大小写0x14:中断; //向量22:TXIFG1中断; 大小写0x16: //向量24:RXIFG0中断; IF (PTR) { * PTR++= EUSCI_B_I2C_masterReceiveSingle (EUSCI_B0_BASE);//获取 RX 数据 if (--cnt =0) { EUSCI_B_I2C_masterReceiveMultiByteStop (EUSCI_B0_BASE); ptr = 0; } } 中断; 情况0x18: //向量26:TXIFG0中断; if (cnt)(如果(cnt) //检查 TX 字节计数器 { EUSCI_B_I2C_masterSendMultiByteNext (EUSCI_B0_BASE、* PTR++); CNT--; //减量 TX 字节计数 器} 其他 { EUSCI_B_I2C_masterSendMultiByteStop (EUSCI_B0_BASE); ptr = 0; } break; case 0x1c:break; //向量30:时钟低电平超时中断; 大小写0x1E:中断; //向量32:第9位中断; 默认值: 中断; }
开始接收的代码为:
void I2C_SEN_Read (int len、char * buf) { eUSCI_B_I2C_setSlaveAddress (eUSCI_B0_BASE、addr); eUSCI_B_I2C_setMode (eUSCI_B0_BASE、eUSCI_B_I2C_receive_mode); eUSCI_B_enable (eUSCI_B0_BASE); CNT = len; ptr = buf; EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT); EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、 EUSCI_B_I2C_Receive_INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT); EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE); }
ptr 变量用于指向缓冲区、但也用于指示接收(或传输)已完成。
问题是、在示波器中、我看到对应于比预期多一个字节的一系列时钟脉冲(即、如果我要求读取一个字节、我会看到两个8位+ACK 脉冲。
但主要问题是 SDA 和 SCL 线路保持低电平。 看起来、EUSCI_B_I2C_masterReceiveMultiByteStop 不执行任何操作。
有人可以帮帮我吗?
谢谢你。
此致。
Mau。