TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] MSP430F233:向右移位的位存在 USCIB0问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/586258/msp430f233-uscib0-issue-with-bits-shifted-to-the-right

器件型号:MSP430F233

您好!

我希望有人能帮助我解决这个问题、因为这让我感到沮丧、只需要一周的时间。

我的目标是在 MSP430和2个 SPI 从器件之间建立有效的通信。

一个从器件是需要 SPI 模式1或3的 DS1390 RTC (CPOL 不关心 CPHA =1),另一个是需要 SPI 模式0或3的 A25L080O 闪存(CPOL = CPHA 0或1) 因此、CPOL =CPHA =1是两种情况的明显选择。

我刚开始使用 RTC、在将时钟设置为特定值后、读操作会返回不稳定的数据。 开始联系技术支持后、我将焦点切换到 Flash (欧洲和美国之间的联系就像每天发送一封邮件一样)、我遇到了类似的不稳定数据。 经过一些分析后、我认为整个 SOMI 线似乎是1个时钟周期到很晚。 将所有内容向左移动1个点将为我提供数据、这会突然为我提供正确的预期数据。

所以我的结论是:Simo 的工作是正确的,因为奴隶的工作是他们应该做的。 SOMI 为1 CLK 关闭。 两个器件的接口。

这是我的代码(很抱歉、变量和注释的德国名称)

void SPI_init (void)//funktion zur Initializierung der SPI Schnittstelle
{
/CS leitungen für RTC Flash
P2OUT |=(1<<7);//RTC
P2OUT |=(1<<6);//闪存
UCB0CTL1 |= UCSWRST;// SPI - Schniteren

+ BIT3 nötig für 2 (1)//CLK、MOSI und MISO für UCB0 An Port 3//SPI

- Mode instellen
//UCSYNC = Synchronmode;UCMST = Mastermode;UCMODE_0 = 3引脚 SPI;UCCKPH =时钟相1;UCCKPL = Clockpolarität 1;UCMSB = MSB Zuerst; UC7BIT = 7位字符

UCB0CTL0 |= UCSYNC + UCMST + UCMODE_0 + UCCKPH + UCCKPL + UCMSB;//UCCKPL eingefügt。 闪存 benötigt CKPH 和 CKPL 标识符(0码器1);RTC benötigt CKPH=1 während CKPL 变量列表;10.3.2017

UCB0CTL1 |= UCSSEL_1;//Taktquelle einstellen 0 = keine;1 = ACLK;2 = SMCLK;3 = SMCLK


// Teeliler für
0x08 UCB08// Teiler 8
UCB0BR1 = 0x00;//erweitter Teiler (*256)

UCB0CTL1 &=~UCSWRST;//Schnittstellenhardware einschalten

IE2 |= UCB0RXIE;//USCIB0 Emptfangs 中断启用

} 

void SPI_SEND_byte (unsigned char data[])
{
lettes_bytes=0;//变量检查最后一个字节以发送
unsigned int i;
chip_select_rtc_on;
for (i=0;i 如果
(i>=1)//从接收 ISR
Zeit[I-1]=(Received_ch)中跳转到发送 ISR;//将接收到的字节写入数组
}

以及发送和接收 ISR

#pragma vector = USCIAB0TX_Vector//Pragma ANweisung für DIE USSCIB0-SENDE ISR


__INTERRUPT void USCIB0TX_ISR (void)/USSCIB0-SENDEISR
{UCB0TXBUF=Transmit
;//Übergabe des SENyte an DEN SENFFER=

UCB0SPI

& UCB0STUSTUSTO & UCB0STUSTUSTUSTU0 & ANE UCB0STUCBI = UCB0STUCB0STUDIO & STUCB0STUDIE UCB0STUDIE ~ UCB0STUDIO;//不会等待发送 UCB// Löschen DES 中断使能位

} 
#pragma vector = USCIAB0RX_Vector//Pragma ANweisung für DIE USCIB0-Emptys ISR


__INTERRUPT void USCIB0RX_ISR (void)//USCIB0-Emptys ISR
{
Received_ch=UCB0RXBUF;//Aussen des Fangspuffers (void)



|= 1 (p2bytes = 1);= 1 (if)|<1)=空(p2p2bytes = 1)


这是仅用于与 RTC 通信的版本。

我希望我没有与 ISR 发生混乱、从而导致 SPI 设置中的混乱或缺失。

我用逻辑分析仪控制所有的事情,CS、CLK 和 SIMO 的所有时序都很好。 即使 SOMI 上的时序看起来不错、唯一的问题是两个器件上都发生向右移位、这让我认为这是 SPI 问题。

对于闪存,我尝试了 CPOL = CPHA = 0的其他配置,但在这种情况下 SIMO 延迟了一位!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请显示单个8位传输的逻辑分析仪屏幕截图。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    D0 = CS

    D1 = SCLK

    D2 = SIMO

    D3 = SOMI

    SOMI 挂起到下一个8位周期、因此应该是0b 0000 0001进入并被解释为0b 1xxx xxxx。 这似乎是所有位的问题。

    主器件在下降沿接收。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚才得到了 RTC 技术支持的回答、他们建议从上升沿采样、而不是从下降沿采样。
    但是、我如何实现它呢? 我唯一想到的是在读取周期开始之前在读取命令之后更改 CPHA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在此屏幕截图中、从器件在下降沿更改 SOMI、因此它期望主器件在上升沿接收。

    A25L080数据表声称它支持模式0和模式3、但忽略了写入位和读取位之间的关系。 您必须确保字节边界正确无误。 我想只有模式0能够处理 MSP 如何移入和移出字节。

    我不知道 DS1390如何检测时钟极性;可能是在事务开始时(CS 变为低电平时)对其进行采样。 无论如何、尝试模式1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DS1390只需在下降沿移出、并在上升沿锁存数据。 未检测时钟极性。

    但是、为了使两者都正常工作、我现在使用 SPI 模式2。
    我觉得有一点困惑、即主器件必须设置为从器件不支持的模式。 我想下次遇到 SPI 问题时、我只需尝试每种模式、不相信数据表!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我有很多项目需要在每次我想与总线上的不同从器件通信时切换 SPI 模式。 这并不罕见。 此外、对于每个制造商来说、SPI 模式不一定相同。 始终查看所需的波形并进行相应的设置。