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.

[参考译文] CCS/MSP430FR2633:I2C 读取功能-在重复启动时发出

Guru**** 2562120 points
Other Parts Discussed in Thread: MSP430FR2633

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/601415/ccs-msp430fr2633-i2c-read-function---issue-at-the-repeated-start

器件型号:MSP430FR2633

工具/软件:Code Composer Studio

大家好、

我已经在 MSP430FR2633 (MSP-CAPT-FR2633板)上编写了 I2C 函数、以与外设 MAX77818电池充电器电量监测芯片进行通信。

我的读取函数在重复起始条件下挂起。 我的意思是清除 UCTXSTT 的检查。 我复制了下面的 I2C 读取函数代码。 我的写入函数似乎正常工作。 因此、我将消除使用硬件的可能性。 我在 SDA 和 SCL 上具有2.2k 的上拉电阻器。 我还在调试中检查了寄存器、确认 NACKIFG 未被置位。  

void read_I2C_Reg (unsigned char Slave_Addr、unsigned char Reg、unsigned char ReadLength)
{
UCB0IFG = 0x00;
PRxDataPtr = 0;//初始化 rxBuffer
PRxData 的起始索引=(unsigned char *) RxBuffer[0];//初始化 PRxData 指针到 RX 缓冲区的开始
RXByteCtr = ReadLength; //将 argumement ReadLength 加载到 RXByteCtr 中,该值表示要读取

的字节数(UCB0STAT 和 UCBBUSY); //确保总线不忙
UCB0I2CSA = Slave_Addr >> 1; //从地址是 Slave_Addr 的7个 MSB 写入 UCB012CSA

UCB0CTLW0 |= UCTR;// I2C TX 模式
UCB0CTLW0 |= UCTXSTT;//起始条件
UCB0TXBUF =寄存器;//要读取的寄存器地址。 这将是传输的数据的第一个字节。
while (UCB0CTLW0 & UCTXSTT);//等待 I2C STT 发送
、同时(!(UCB0IFG & UCTXIFG); //已发送注册

器 UCB0CTLW0 &=~UCTR;//切换到接收模式
UCB0CTLW0 = UCTXSTT;//发送重复起始条件。
while (UCB0CTLW0和 UCTXSTT);//等待 I2C STT 被发送<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< UCTXSTT 不会被清除。 在这里等候。 

while (RXByteCtr > 0)//如果我们已请求读取多个字节,循环
{while
(!(UCB0IFG & UCRXIFG));//等待 RX 标志上升。 那么 UCB0RXBUF 有数据
RxBuffer[PRxDataPTR]= UCB0RXBUF; //用接收到的 UCB0RXBUF
PRxDataPtr++在索引 PRxDataPtr 处填充 RxBuffer;//递增 PRxDataPtr
RXByteCtr --;//递减 RXByteCtr
}

while (!(UCB0IFG & UCRXIFG);
* PRxData = UCB0RXBUF;//将最终 RX 数据移动到 PRxData
UCB0CTLW0 |= UCTXNACK;//停止
UCB0CTLW0之前的 NACK |= UCTXSTP;//在
(!(UCB0CTL1 & UCTXSTP)时发出停止条件;//确保已设置停止条件
} 

我的 I2C 初始化如下所示。 16MHz DCO 源自 SMCLK:

void Init_MSP430_I2C (void)
{
P1SEL0 |= BIT2 | BIT3;//将 I2C 引脚分配给 USCI_B0
UCB0CTLW0 |= UCSWRST; //启用 SW 复位
UCB0CTLW0 |= UCMST | UCMODE_3 | UCSYNC;//I2C 主器件、同步模式、默认为7位模式
UCB0CTLW0 &=~UCMM;//多主器件 I2C 的~,不相关,但作为预防措施&“d”
UCB0CTLW0 = UCSSEL_3; //使用 SMCLK,
UCB0BR0 = 160; // fSCL = SMCLK/160 =~100kHz以上100kHz 至400kHz'快速 I2C
UCB0BR1 = 0;
UCB0I2CSA = 0x00; //为初始化目的设置为 AA。 读取和写入函数中接受从器件地址作为参数。
UCB0CTLW0 &=~UCSWRST; //清除 SW 复位,恢复操作
UCB0IFG |= 0x00;
} 


另一个 bizzare 观察结果:直到它到达 UCTXSTT 的永无休止检查时,我的寄存器设置将保持初始化状态。 当它在突出显示的行挂起时、我暂停并通过调试器观察到一些寄存器发生了变化。 在 USCI_B0_I2C 寄存器下、最重要的是 UCB0CTLW0显示0x01D2。 这意味着 UCMODEx 位是00b、不再处于 I2C 模式! UCTR 已重新打开、尽管它之前已关闭。

是否有人能够帮助我修复、并理解为什么代码会在重复启动时停止? 我们非常感谢您提供任何指导。


此致、谢谢!

Guyan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Guyan、  

    UCB0CTLW0 = UCTXSTT; //发送重复起始条件。 

    使用这一行代码、您将设置整个寄存器而不是仅设置起始位、我认为您的意思是执行如下操作:

    UCB0CTLW0 |= UCTXSTT; //发送重复起始条件。 

    另外、请查看 首次 遇到通信问题时 MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题的解决方案。 本文档提供了大量有关最常见 I2C 问题以及如何解决这些问题的重要信息。

    此致、  

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Caleb、

    非常感谢您指出这一错误! 我当然打算使用|=

    我的写入和读取函数不再挂起。 但读取的值不是预期读取的值。 这可能是 I2C 从设备 MAX77818的问题。 因此我想使用 stdio.h 中的 printf()来读取和打印值,以便进行调试。 但是,如果我包含 stdio.h 并使用 printf( )。

    黄色警告:
    警告#10229-D:输出段".data"是指加载符号"_nop"、因此无法压缩;压缩"lzss"会被忽略

    红色错误:
    "./lnk_msp430fr2633.cmd"、第132行:错误#10099-D:程序将无法放入可用内存中。 对于“All_FRAM"大小为0x49be 的段,定位失败。 可用存储器范围:


    为了能够在此器件中使用 printf、我该怎么办?
    谢谢、此致、
    Guyan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Caleb、

    我找到了 printf 问题的修复。
    我将在下面键入我如何修复它。 如果其他人遇到这种情况、希望它能帮助他们。

    右键点击工程、然后转到"属性"
    1) CCS Build -> MSP430 Compiler -> Advanced options -> language options -> level of prontf/scanf support required - set to minimal。
    2) CCS Build -> MSP430 Compiler -> MSP430 Linker -> Basic options -> Heapsize for dynamic memory allocation - set to 320、set C system stack size to 80

    此致、
    Guyan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Guyan、

    很抱歉、我的回复很晚、上周我已经不在办公室了。 在这里、您能够弄清楚如何使 printf 功能正常工作、这一点很好。 在我关闭此主题之前、您还有其他问题吗?

    此致、
    Caleb Overbay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Caleb、

    我确实取得了一些进展、但当我使用重复起始读取寄存器时、我遇到另一个路块、寄存器读取了错误的值(相同的值)。 不幸的是、我现在不得不将该项目停驻、因为我被困在那里。 我一定会在稍后再参加、因为该产品是必不可少的。

    我想、您可以关闭该线程。 由于这是重复性的开始阅读(主题略有不同)问题、如果我在经过一些尝试后无法通过、我将在论坛中发布它。 非常感谢您再次与我取得合作。 )

    此致、
    Guyan