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.
您好!
我希望有人能帮助我解决这个问题、因为这让我感到沮丧、只需要一周的时间。
我的目标是在 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 延迟了一位!
我有很多项目需要在每次我想与总线上的不同从器件通信时切换 SPI 模式。 这并不罕见。 此外、对于每个制造商来说、SPI 模式不一定相同。 始终查看所需的波形并进行相应的设置。