请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430F6779A 因此、我一直在尝试接收一些通过 I2C 连接到 I/O 扩展器的数字 INPIT 位。 代码在几个月前就运行过一次、但现在当我再次尝试时、它不起作用。 当我在中断矢量表中为 NACK 中断标志添加断点时、我发现微控制器正在获取 NACK 标志。 我100%确定从器件地址正确(0x19)。 我已启用所有中断、但当我尝试接收字节信息时、代码会停留在 while 循环中。 这表明主器件和从器件之间的连接没有建立、这会导致问题的发生。 我已经尝试了一切以使它正常工作、但它不起作用。 请在这里帮助我。
我遇到卡滞的部分位于下方。 当我尝试在主电源 while 环路中接收字节时、代码卡在 EUSCI_B_I2C_masterReceiveSingle while 环路中。 当我尝试在中断中调用如下代码所示的同一函数时、控制器不会到达该语句、因为 RXIFG 位未置位。
uint8_t eUSCI_B_I2C_masterReceiveSingle (uint16_t baseAddress) { //如果 RXIE 未被使能则轮询 RXIFG0 if (!(HWREG16 (baseAddress + OFS_UCBxIE)& UCRXIE0)) { while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCRXIFG0)) //代码卡在此处 { ; } } //读取一个字节。 返回(HWREG16 (baseAddress + OFS_UCBxRXBUF)); }
这是我通过 I2C 接收数据的整个代码
#define SLAVE_ADDRESS 0x19 #include "driverlib.h" uint8_t RXData; void main (void) { //停止 WDT WDT_A_HOLD (WDT_A_base); GPIO_setPeripheralModuleFunctionInputPin ( GPIO_PORT_P4、 GPIO_PIN4 + GPIO_PIN5 ); EUSCI_B_I2C_initMasterParam param ={0}; param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK; //将时钟源设置为 SMCLK param.i2cClk = UCS_getSMCLK (); param.datarate = EUSCI_B_I2C_SET_DATA_RATE_100KBPS; param.byteCounterThreshold = 1; //要接收的字节数 param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP; //无自动停止。 如果接收到所需的字节(在本例中为-1)、我可以将其设置为停止。 EUSCI_B_I2C_initMaster (EUSCI_B1_base、¶m); EUSCI_B_I2C_setSlaveAddress (EUSCI_B1_base、 从器件地址 ); //将主设备设置为接收模式 EUSCI_B_I2C_setMode (EUSCI_B1_BASE、 EUSCI_B_I2C_Receive_mode ); UCB1IE = 0; //启用 I2C 模块以启动操作 EUSCI_B_I2C_ENABLE (EUSCI_B1_BASE); EUSCI_B_I2C_clearInterrupt (EUSCI_B1_base、 EUSCI_B_I2C_Receive_INTERRUPT1 + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT); //清除所有必需的中断 EUSCI_B_I2C_enableInterrupt (EUSCI_B1_BASE、 EUSCI_B_I2C_Receive_INTERRUPT1 + EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT + EUSCI_B_I2C_NAK_INTERRUPT ); _ENABLE_INTERRUPT (); //_bis_SR_register (GIE); while (1) { _DELAY_CYCLES (2000); while (EUSCI_B_I2C_Sending _stop = EUSCI_B_I2C_masterIsStopSent (EUSCI_B1_BASE) { ; } // I2C 启动条件 EUSCI_B_I2C_masterReceiveStart (EUSCI_B1_BASE); } } #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=USCI_B1_vector __interrupt #elif defined (__GNU__) __attribute__(INTERRUPT (USCI_B1_vector)))#endif void USCIB1_ISR (void ) 静态 uint8_t 计数= 0; switch (__evo_in_range (UCB1IV、0x1E)) { 情况0x00: 中断; //向量0:无中断中断; 情况0x02:break; //向量2:ALIFG 中断; 情况0x04: EUSCI_B_I2C_masterReceiveStart (EUSCI_B1_BASE); 中断; //向量4:NACKIFG 中断; 情况0x06:break; //向量6:STT IFG 中断; 情况0x08:break; //向量8:STPIFG 中断; 情况0x0a:中断; //向量10:RXIFG3中断; 情况0x0c:中断; //向量14:TXIFG3中断; 情况0x0E:中断; //向量16:RXIFG2 break; 情况0x10:中断; //向量18:TXIFG2中断; 情况0x12: RXData = EUSCI_B_I2C_masterReceiveSingle ( EUSCI_B1_BASE ); 中断; //向量20:RXIFG1 break; 情况0x14:中断; //向量22:TXIFG1中断; 情况0x16: RXData = EUSCI_B_I2C_masterReceiveSingle ( EUSCI_B1_BASE ); //获取 RX 数据 中断; //向量24:RXIFG0中断; 情况0x18:break; //向量26:TXIFG0中断; 情况0x1a: 中断; //向量28:BCNTIFG 中断; 情况0x1c:中断; //向量30:时钟低电平超时中断; 情况0x1E:中断; //向量32:第9位中断; 默认值:break; } }
请帮我、我不确定我在做什么。 我已经花了几周的时间尝试找出这个问题。Pls 帮助。 谢谢