工具/软件:Code Composer Studio
您好!
我想使用 MSP430 (主器件)控制四个菊花链 SPI 从器件。 我在执行此操作时遇到了几个问题:
我希望 SPI 时钟速率为16MHz、这是我的微控制器的最大时钟频率。 下面是我要做的:
BCSCTL1 = CALBC1_16MHz;//将范围设置为16MHz DCOCTL = CALDCO_16MHz;//将 DCO 阶跃和调制设置为16MHz UCA0BR0 |= 0x01;//波特率 UCA0BR1=0;
当我将时钟速率设置为16MHz、并观察 MSP430生成的 Din 和 SCLK 信号时、它看起来几乎像一个正弦波(上升时间真的很慢)。 当我将时钟减慢至1MHz 时、两个信号看起来不错。 我想以16MHz 的频率运行 SPI clk。 如何在不影响信号完整性的情况下做到这一点?
每个从器件都有8个开关、因此对于四个器件、我需要向从器件一发送32位。 然后、这些位应通过移位寄存器到达最后一个器件、我不知道如何执行此操作。 我将按如下方式发送8个位:
P1OUT &=~0x02; //选择器件 IF (IFG2 & UCA0TXIFG)//如果 USCI_A0 TX 缓冲器就绪 { UCA0TXBUF = 0x2D;//通过 SPI 将数据发送到从 机} IF (IFG2 & UCA0RXIFG);//如果 USCI_A0 RX 接收 到{ Received_ch = UCA0RXBUF;//存储接收到的数据 P1OUT |= 0x02;//取消选择器件,更新开关 }
有人能告诉我如何做到这一点吗?
以下是供您参考的完整代码:
#include "msp430G2553.h" volatile char received_ch = 0; int main (void){ WDTCTL =(WDTPW | WDTHOLD);//停止看门狗定时器 BCSCTL1 = CALBC1_16MHz;//将范围设置为16MHz DCOCTL = CALDCO_16MHz;//将 DCO 阶跃和调制设置为16MHz P1OUT &=~0x02;//芯片选择(P1.1) P1DIR |= 0x02;//将引脚设置为输出方向 P1SEL = 0x14;//将特殊功能设置为定时器模块(P1.4->SCLK、P1.2->DIN) P1SEL2 = 0x14;//通用串行通信 UCA0CTL1 = UCSWRST;//将模块置于复位模式以设置操作 UCA0CTL0 |= UCCKPH + UCMSB + UCSTM+ UCS0CTL1;// UCS0CTL0| UCA0CMP0 | UCCKP0 | UCA0| UCCKP0 | UCA0CMP0 | UCC1 | UCS0CMP= UCA0CMP0 | UCC1 | UCS0CMP0 | UCS0CL //使用 SPI 模式 UCA0CTL1 &=~UCSWRST;//初始化 USCI 状态机 IE2 |= UCA0TXIE;//启用 USCI0 TX 中断 _BIS_SR (GIE)时,应清除波特率 UCA0BR1 = 0;//无调制;//启用 USCI0 TX 中断_BIS_SR (GIE);//启用全局中断 while (1);//无限循环 } #pragma vector=USCIAB0TX_vector __interrupt void USCI0TX_ISR (void) { P1OUT &=~0x02;//同步不为低电平有效。 当低电平时、当高电平数据被更新时、DIN 和移位寄存器被启用。 if (IFG2 & UCA0TXIFG)// if USCI_A0 TX buffer READY { UCA0TXBUF = 0x2D;//通过 SPI 发送数据到从 机} if (((IFG2 & UCA0RXIFG));// if USCI_A0 RX received { received_ch = UCA0RXBUF;//未接收 到数据|= 0x02 };//选择器件|更新= 0x02}