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.

[参考译文] MSP430F5529:UCB1RXBUF 读取的时序延迟?

Guru**** 2589265 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/626092/msp430f5529-ucb1rxbuf-timing-delay-for-read

器件型号:MSP430F5529

您好!

刚刚浏览了与我所遇到的问题相关的大部分其他主题、我似乎找不到任何其他具有相同问题的人。 我遇到的问题是、我设法向存储器 IC 发送和接收 SPI 数据、但问题是代码的读取部分。 我已连接的逻辑分析仪显示我正在将正确的值输入 MISO 端口、但当我单步执行 code composer 时、它会读取0值、除非我在读取 UCB1RXBUF 处断点。 如果我恰好在读取 UCB1RXBUF 行的断点、它会显示适当的值被载入到我的变量中、我可以继续程序、它会将值传递到我需要的位置、但是如果我在它显示0后中断。 似乎需要一个延迟或给它时间将值传输到变量。

unsigned int Mem_Read_Status (空)

while (!(UCB1IFG & UCTXIFG));   //检查 TX 是否就绪?

UCB1TXBUF = Mem_RDSR;          //填充 UCB1TXBUF

while (!(UCB1IFG & UCTXIFG));  //检查 TX 就绪

UCB1TXBUF = 0x00;            //为时钟生成虚拟数据

同时(!(UCB1IFG 和 UCRXIFG);   // USCI_B1 RX 数据准备就绪可被读取

SPI_Data_Read = UCB1RXBUF;     //读取 RX 缓冲  器<--在此处添加断点并显示值

返回 SPI_Data_Read;           //返回值      <--在这里添加断点值显示0

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

    在这种情况下、在轮询 RXIFG 之前、您需要将其清除。 当您发送 MEM_RDSR 和0x00时、会设置 RXIFG、因为在任何 SPI TX 操作期间数据都是"读取"的。 因此、在这种情况下、如果在轮询前不清除 RXIFG、代码会立即读取 RXBUF 中的值。

    当你设定一个断点时、你将为从器件提供足够的时间来将数据发送到 MSP430并且 RXBUF 中的数据被自动覆盖。 因此、当您放置断点时、看起来事情正在正常运行。

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

    当我在为我的另一个函数填充 Txbuffer 后立即清除 RX 标志时、这似乎有所帮助、在该函数中、我只传输1个字节并在之后读取它。 我申请了另一个具有多个 txbuffer 传输的应用、它似乎没有帮助。 我是否需要在该特定子例程内的每次 TX 传输后清除该标志?

    unsigned int Mem_Read_Byte (unsigned int mem_address)

       MSB_Address = mem_address & 0xff;
       LSB_Address =((mem_address >> 8)& 0xff);

       P4OUT &=~BIT0;                //启用 CS

       UCB1TXBUF = Mem_Rd;            //发送读取指令
       while (!(UCB1IFG & UCTXIFG));  //检查就绪
       UCB1TXBUF = LSB_Address;       //发送地址的第一部分
       while (!(UCB1IFG & UCTXIFG));  //检查就绪
       UCB1TXBUF = MSB_Address;       //发送第二部分地址
       while (!(UCB1IFG & UCTXIFG));  //检查就绪

       UCB1TXBUF = 0x00;              //发送虚拟的时钟脉冲
       UCB1IFG &=~UCRXIFG;           //将标志清零为发送总是置位 RX 标志
                       
       while (!(UCB1IFG & UCTXIFG));  //检查 TX 是否就绪?

       while (!(UCB1IFG & UCRXIFG));   // USCI_B1 RX 缓冲区已完成读取?
       SPI_Data_Read = UCB1RXBUF;      //通过读取该标志来清除该标志

       P4OUT |= BIT0;                 //禁用 CS

       返回 SPI_Data_Read;

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

    自我回复、

    我想我通过重新安排何时检查标志来获得它。

    UCB1TXBUF = 0x00;              //发送虚拟的时钟脉冲

    while (!(UCB1IFG & UCTXIFG));  //检查 TX 是否就绪?

     UCB1IFG &=~UCRXIFG;           //将标志清零为发送总是置位 RX 标志
     while (!(UCB1IFG & UCRXIFG));   // USCI_B1 RX 缓冲区已完成读取?

     SPI_Data_Read = UCB1RXBUF;      //通过读取该标志来清除该标志

    这似乎达到了目的。

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

    很高兴看到您能够解决这个问题。 借助 SPI 通信、您需要记住、数据在发送数据的同时被接收。 在您发布的 Mem_Read_Byte 函数中、清除 RXIFG 不起作用、因为您在填充 TXBUF 后立即将其清除、并且没有足够的时间发送/接收数据。 在之后发布的代码中、在清零 RXIFG 前检查 TXIFG 可确保发送/接收过程已完成。

    此致、
    Caleb Overbay