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/MSP430F67621:eUSCI SPI 从器件选择(STE)在主器件的第一次传输后停止

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/713725/ccs-msp430f67621-eusci-spi-slave-select-ste-stops-after-first-transfer-from-master

器件型号:MSP430F67621
主题中讨论的其他器件: MSP430WARE

工具/软件:Code Composer Studio

我正在与 MSP430F67621A 一起开发一个项目、在该项目中、我需要从两个 MSP430向基于 Linux 的主机发送数据。 这三个器件通过 SPI 进行连接、并具有从 Linux 主机到每个 MSP430的片选线路。 Linux 主机是 SPI 主器件、MSP430是从器件。

我看到了一个奇怪的问题、如果我在3引脚 SPI 从模式下配置 MSP430 eUSCI 模块、一切看起来都正常、 但是当我尝试使用4引脚模式时、MSP430只在第一次响应主器件-之后每次从器件都不响应。 (请注意、虽然我有两个 MSP430可供使用、但此示例仅在其中一个 MSP430上运行、第二个 MSP430被禁用)。

我在一次从主器件传输中读取的字节数量似乎无关紧要、我总是在第一次获取数据、然后在后续传输中获取零。 我已经将 STE 引脚映射到 P2.7。

我已经设置了一个演示问题的基本 Code Composer Studio 项目、这是 main.c 文件:

#include 
#include 

#include 

uint8_t send_Bytes[]=\
{
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x01、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x02、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x03、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x04、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x05、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x06、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x07、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x08、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x09、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0A、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0B、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0C、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0D、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0E、
0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0F
};

const uint8_t SEND_Len = 120;
uint8_t SEND_CTR = 0;


int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//启用全局中断
_bis_SR_register (GIE);


//将 SPI 引脚配置为辅助功能模式
P1SEL |= BIT4 | BIT4;// P1.4 + P1.5 (UCA1SOMI、UCA1SIMO)
P2SEL |= BIT4; // P2.4 (UCA1CLK)

//配置 SPI 'STe'引脚
PMAPPWD = PMAPPW; //启用写入访问以修改端口映射寄存器
P2SEL |= BIT7; //将 P2.7设置为辅助功能模式
P2MAP7 = PM_UCA1STE;//映射到 UCA1STE 函数

//将 USCI 状态机置为复位状态,以便更改选项
UCA1CTLW0 = UCSWRST;

/*
* UCA1CTLW0:USCI_A1控制寄存器
*位字段表示以下内容:
* UCCKPH:时钟相位选择
* UCCKPL:时钟极性选择
* UCMSB:MSB 优先选择
* UC7BIT:字符长度
* UCMST:主控模式选择
* UCMODEx:USCI 模式
* UCSYNC:同步模式使能
*
UCA1CTLW0 =
UCCKPH |// 1b =数据在第一个 UCLK 边沿上被捕捉并在下一个边沿上被改变
//UCCKPL |// 0b =无效状态为低电平
UCMSB |// 1b = MSB 优先
//UC7BIT |// 0b = 8位数据
//UCMST |// 0b =从机模式
UCMODE_2 |// 10b = UCxSTE 低电平有效的4引脚 SPI:当 UCxSTE = 0时、从器件被启用
UCMODE_0 |// 00b = 3引脚 SPI
UCSYNC; // 1b =同步模式

/*
* UCA1BR0:USCI_A1比特率控制寄存器0
* UCA1BR1:USCI_A1比特率控制寄存器1
*位时钟预分频器字节。 的16位值
*(UCA1BR0 + UCA1BR1×256)组成预分频器
*值 UCBR1。
*
UCA1BR0 = 0x02;
UCA1BR1 = 0;

//使 USCI 状态机脱离复位状态、使用给定的选项启动它
UCA1CTLW0 &=~UCSWRST;

/*
* UCA1IE:USCI_A1中断使能寄存器
* UCTXIE:发送中断使能
* UCRXIE:接收中断使能
*
UCA1IE |= UCRXIE;//启用 RX 中断
// UCA1IE |= UCTXIE;//启用 TX 中断
}


// USCI_A1中断矢量服务例程。
#if defined (__TI_Compiler_version__)
#pragma vector=USCI_A1_vector
__interrupt
#elif defined (__GNU__)
__attribute__((interrupt (USCI_A1_vector)))
#endif
void USCI_A1_ISR (void)
{
开关(_偶数_IN_RANGE (UCA1IV、2)){
//Vector 2 - RXIFG
案例2:
//等待 USCI_A1 TX 缓冲区准备就绪
while (!(UCA1IFG & UCTXIFG));

//通过 SPI 发送
UCA1TXBUF = SEND_Bytes[SEND_CTR];

SEND_CTR +;
if (send_CTR > send_len){
SEND_CTR = 0;
}
中断;
默认值:break;
}
} 

编辑:示例中更新了数组和长度

在 eUSCI 模块被 STE 引脚作为从器件触发后、我是否需要执行一些操作来重新启用它?

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

    您能否捕捉与所有相关信号(SPICLK、SIMO、SOMI、STE)通信的示波器图、以防出现错误?
    在您的情况下、您不仅要发送一个字节、还要发送多个字节。 主器件是否仍在激活从器件(STE=LOW)以便能够发送?

    另请检查阵列的长度、它是166而不是174。

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

    谢谢-我试图使我的示例代码稍微更近一点、并将其累加、但忘记更改长度。 我现在修复了示例代码、问题仍然会发生。

    我完成了许多示波器捕获:

    1. 首先、我对 Raspberry Pi 进行了8字节传输(即8×8位时钟、STE 线路被置位)-似乎我可以无限地运行8字节传输、而不会出现任何问题、MSP430会为每个传输发送预期的数据。 (如下所示)
    2. 接下来、我进行了64字节传输-再说一次、这些数据似乎能够无限期运行、我可以在 Pi 的循环中运行它、并进行多次64字节传输、每个字节都有正确的数据。
    3. 然后我尝试了一个100字节的传输-这就是问题出现的地方。 第一个100字节传输工作正常、但 MSP430似乎卡住了、不会继续调用 SPI ISR 来将下一个字节添加到缓冲区中、因此同一字节被发送100次。 (如下所示)



    在以下图像上、以下通道映射适用:

    • CH 1 -黄色:时钟
    • CH 2 -绿色:MOSI
    • CH 3 -蓝色:MISO
    • 通道4 -红色:芯片选择(STE)

    第1个8字节传输:

    第2个8字节传输:

    第200个8字节传输:


    第1个100字节传输:

    请注意、在图像中很难看到、但 MISO 上的数据确实会按预期发生变化。

    第2个100字节传输:

    请注意、MISO 上的数据被卡住、即它是同一个字节反复传输。


    当我在循环中运行100字节传输时、我注意到、每次传输大约5-10次、它都会返回有效数据-但在其他情况下、它会"卡在"同一输出中。

    对于使用 eUSCI 模块进行单个 SPI 传输时可以发送的字节数、内部是否有一定的上限? 似乎我可以传输尽可能多的64字节数据块、但100字节会破坏 eUSCI 或 MSP430代码的其他部分。

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

    您好 Sean、

    您是否查看 了勘误表、您的问题可能与 USCI50错误有关。

    此外、我建议您查看 《MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题解决方案》应用报告

    解决此问题的第三种方法还可以是查看我们在 MSP430Ware 中提供的代码示例、这些示例应与 CCS 一同提供。 您可以在 CCS 中使用 TI Resource Explorer 并浏览到您的器件。 我们提供了 SPI 代码示例、这些示例还可以帮助您找到解决问题的方法。

    请告诉我您是否采取了这些步骤。

    谢谢、此致、

    Britta

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    虽然我在从模式而不是主模式下使用 MSP430、但 USCI50的音质与此类似。

    经过一些实验、我发现我能够进行多个64字节传输、而不是执行单个200字节传输。 也可以进行较小的传输、但超过64字节会导致问题。 我的 MSP430代码被写入、这样它跟踪它已经发送了多少字节、并且在 STE 引脚被置为有效时不会自行复位(而是主器件在需要时发送一个复位代码)。 然后、主器件侧 Python 代码只需重新汇编单独的传输即可。

    我没有准确地弄清为什么会发生这种情况、但对于我的问题、执行几次较短的传输而不是一次较大的传输是可以接受的解决方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sean、

    您已将其标记为已解决、因为您的变通办法适合您。
    您是否有兴趣进一步了解导致问题的原因、或者您是否愿意继续、在这种情况下、我只想关闭此主题、

    此致、
    Britta
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Britta、我对解决方法感到满意、希望如果其他人遇到类似问题、此帖子也可能对他们有所帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到这个消息。 我相信这对其他人也很有帮助!

    谢谢、Britta