Other Parts Discussed in Thread: MSP430FR6879
我尝试使用 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.
Other Parts Discussed in Thread: MSP430FR6879
我尝试使用 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。