您好!
我希望有人能帮助我解决这个问题、因为这让我感到沮丧、只需要一周的时间。
我的目标是在 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 延迟了一位!