我尝试使用 RTC (idt1338),并 通过 I2C 协议将它与 msp430fr6879连接。 我所面临的问题是、有时、在大多数情况下、代码不会进入 I2C 中断例程。 即未建立通信。 但一旦通信确定为进入中断例程的切换情况,一切都正常,但这种情况很少发生。 可能的问题是什么。
在硬件方面,我使用4.7K 电阻器上拉了 sda 和 SCL 引脚。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我尝试使用 RTC (idt1338),并 通过 I2C 协议将它与 msp430fr6879连接。 我所面临的问题是、有时、在大多数情况下、代码不会进入 I2C 中断例程。 即未建立通信。 但一旦通信确定为进入中断例程的切换情况,一切都正常,但这种情况很少发生。 可能的问题是什么。
在硬件方面,我使用4.7K 电阻器上拉了 sda 和 SCL 引脚。
Noble、您好!
感谢您的发帖。 "MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题的解决方案"文档在第10页介绍了 I2C。 这将涵盖最常见的 I2C 问题以及如何检查这些问题、并可能有助于解决您的问题。 如果您对该文档有任何疑问、请告诉我。
此外、当器件尝试通信时、您能否通过监测通信线路的逻辑分析仪或示波器发布输出?
此致、
Matthew
控制器无法正确生成 START 或 STOP 脉冲、我假设控制器无法正确驱动引脚、因为我的程序在调用 START 条件或 STOP 条件后卡住。ustp 或 ucstt 保持置位、 根据我的知识、这意味着控制器无法完成生成 START 或 STOP 脉冲。 另一个奇怪的现象是 、当我将 CRO 与 sda 线连接时、会产生起始脉冲或停止脉冲。
亲切的导游。
herin 是我的代码
#include volatile unsigned char TXData[]={0x00、0x12、0x13、0x14、0x01、0x02、0x10、0x17}; volatile unsigned char TXByteCtr; volatile unsigned char flag=0; volatile unsigned char out RxData[7];void init (void);volatile unsigned char int (void)= 0;volatile unsigned int = 6|WTIv= 3;blatile DTCDITr =~3 | WITDIT= 3;void Dt = 3;bt = 3 | WTIv= 3;bt = 3;bt = P6OUT &=~BIT2; //____________________________ I2C 初始化________________________________ //-------- 配置 GPIO--------------- P4SEL1 |= BIT6 | BIT7;// I2C 引脚 P4SEL0 &=~(BIT6 | BIT4);// I2C 引脚 LCDCPCTL0 = 0x0000; //将 USCI_B0配置为 I2C 模式 UCB1CTLW0 |= UCSWRST;//将 eUSCI_B 置为 UCB1CT0 | UCB1CTLW0 | UCS1CMOST= 0x68;//将 UCB1CL0置为 UCS1CMOST_B;// UCS1CMOST= UCT0 | UCS0 | UCB1CMOST= UCS0 | UCS0 | UCS1CMOCTL //配置从地址 UCB1BRW = 0x04;//波特率= SMCLK / 2 UCB1CTLW0 &&~UCSWRST;//清除复位寄存 器 UCB1IE |= UCTXIE + UCNACKIE + UCRXIE;//发送和 NACK 中断使能 __bis_SR_register (GIE);__________________________ I2C INTIT 结束____________________________ _DELAY_CYCLES (3000000);// 250ms 延迟 //--- 流= 0 =>写入时间------------------------ flow=0; TXByteCtr = 8;//在 (UCB1CTLW0和 UCTXSTP)时加载 TX 字节计数器;//确保发送了停止条件 UCB1CTLW0 |= UCTR; __DELAY_CYCLLES (120000); UCB1CTLW0 |= UCTXSTT;// I2C TX,启动条件 while (0000-=-=-=-/-=0;(flag)---=-=0;-); flow= 1 =>写入地址指针------------ flow=1; TXByteCtr = 1;//在 (UCB1CTLW0和 UCTXSTP)期间加载 TX 字节计数器;//确保发送了停止条件 UCB1CTLW0 |= UCTR | UCTXSTT;// I2C TX,在 (flag = 0)期间启动条件(flag = 0);//--- 流2读取时间------------------------------------------------------- flow=2; TXByteCtr = 7;//加载 TX 字节计数 器 UCB1CTLW0 &=~UCTR; UCB1CTLW0 |= UCTXSTT;// I2C TX,启动条件 while (flag = 0); flag = 0; __delay_cycles (120); while (UCB1CTLW0 & UCTXSTP- ) ————————————~———————UCB1C1C1CT10D——————————————————————————————————————————————————————————————————————————— 流1写入指针------------------------------------------------------- __delay_cycles (120); flow=1; TXByteCtr = 1;//在 (UCB1CTLW0和 UCTXSTP)时加载 TX 字节计数器;//确保发送了停止条件 UCB1CTLW0 |= UCTR | UCTXSTT;// I2C TX,在 (flag = 0)时启动条件;flag=0------ 流2读取时间------------------------------------------------------- __DELAY_CYCLS (120); flow=2; TXByteCtr = 7;//加载 TX 字节计数器 // while (UCB1CTLW0 & UCTXSTP);//确保停止条件已发送 UCB1CTLW0 &=~ ~UCTCTCTCTCTLW0;UCB1CTLW0 |= UCTXSTT;// I2C TX、START 条件= UCB1CTLW0;while = UCB1CTLW0 (UCTLW= UCTXSTP= UCT120);while = UCB1CTLW= UCB1CTLW0 + UCTLW= UCTLW0 (UCTL = UCTL = UCTLW0); UCB1CTLW0 |= UCTXSTP;//确保已发送停止条件 __DELAY_CYCLS (120);// 12个用户 } #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__) #Elima vector = USCI_B1_vector __INTERRUPT _B1_ISR (#USCI_B1_void ) (USCI_B1_ISR void)(#USCI_B1)_INTERRUCT_B1_ISR (UCI_B1 void)(USC_B1 void)(#USCI_INTERRUCT_B1)_INTERRUCT_B1 (UST_NOT_ISR (UST_NOT_COVERSI_NOT_CO_NO #endif { switch (__even_in_range (UCB1IV、USCI_I2C_UCBIT9IFG)) }{ case USCI_none:break;//向量0:无中断 情况 USCI_I2C_UCNACKIFG://向量4:NACKIFG UCB1CTLW0 |= UCTXCLT/ UCBTXIFG = UCTX0 ~ ;//如果 TXCNT2 = UCBxTXCr = UCBTXIFG & UCBTXCRTUCTR = UCTR 2;如果是 UCBxTXCr = UCTR = UCB0/ UCBTXCr 1、则为 UCBxTXIFG = UCTR 2;//如果是 UCTR = UCTR 2;如果是 UCTR = UCBxTXC //加载 TX 缓冲 区 TXByteCtr ^;if (TXByteCtr = 0){UCB1CTLW0 |= UCTXSTP;// I2C 停止条件标志= 1;P6OUT = BIT2;//减量 TX 字节计数 器 } break;//向量22:RXIFG0 case USCI_I2C_UCTC0 ={TXBUT8}(如果 TXBUT0)= UCTBUT0)/向量 TX 字节计数器}(如果 TXBUCtr = UCTX0)}(TXBUT0://(TXBUT0) //加载 TX 缓冲 区 TXByteCtr ^;//如果(TXByteCtr = 0)则减量 TX 字节计数器{flag=1;UCB1CTLW0 |= UCTXSTP;// I2C 停止条件 UCB1IFG &=~UCTXIFG;//清除 USCI_B0 TX int 标志 P6OUT = UCTXCtr = 0x1UCB1UCTF ;//如果 TXByteCtr = 1}= UCTXf;// TXBUT = 1 (如果= 1);// TXBt = 1) //减量 TX 字节计数 器} else{flag=1; } } UCB1IFG &=~UCTXIFG; break; default:break; }
Noble、您好!
我在上面发布的文档包含调试设置的步骤。 第2页提供了通用 eUSCI 信息和调试步骤、第10页提供了特定于 I2C 的信息和调试步骤。 如果您对项目执行这些步骤、您很可能会发现问题。
如果您可以访问其中一个、 逻辑分析仪或示波器将非常有助于调试您的设置。 如果您愿意、您可以在此处发布输出、我将帮助您对其进行解密。
此外、您还可以在 Resource Explorer 上找到可供参考的代码示例。 这里是 MSP430FR6879的 I2C 示例、还有其他几个示例可供您查看。
此致、
Matt
你好 Matthew、
正如您所建议的那样、我也浏览了文档和代码示例。
我或多或少接近这个问题、这就是我发现的问题、
通常,代码运行正常。如果发生任何故障(如断电 ),通信未完成,并且未生成停止条件, 则 clk 线路被 MSP430控制器保持在低电平, 状态寄存器的 BUSY 标志和 SCL 低电平标志被置位、
现在,即使在重新初始化(使用复位)模块或重新启动(加电)整个板后 ,状态 标志仍然保持不变,即 BUSY 和 CLK 低电平保持置位。 在对 CRO 进行进一步分析时、发现即使重新启动器件和 clk 线路后、数据线路仍保持低电平、 这两个引脚实际上都应 在加电状态下上拉。 探针越快接触 clk 线、它就会被上拉、数据线也会被上拉。 器件将再次开始工作。
请帮我解决这个问题。
此致、
Noble Ajay。