对于以下代码、我期望得到 的 SIMO 为8位0x0F、8位0x5F。
相反、我得到的是0x09的8位、后跟0x00的8位。 请参见下面的示波器迹线、其中顶部迹线为 SCLK、底部迹线为 SIMO。
代码有什么问题?
我将 SPI 写入放在一个循环中、以便我可以更轻松地在示波器上进行捕获;通常我只会向每个地址写入一次。
#include
int main (空)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
P1DIR |= BIT0 ++BIT2 + BIT3 + BIT4;// nCS_BD、nRST_BD、SIMO、SCLK 为输出
P2DIR |= BIT6;// nPWM1_BD 是输出
P1SEL = BIT1 + BIT2 + BIT4;// SOMI、SIMO SCLK 为 SPI
P1SEL2 = BIT1 + BIT2 + BIT4;// ditto
P2SEL &=~BIT6;//使 P2.6 (nPWM1_BD)不是 XIN
UCA0CTL0 |= UCSWRST;// eUSCI 逻辑保持在复位状态
UCA0CTL0 |= UCMSB+UCMST+UCSYNC+ UCCKPH;// 3引脚8位 SPI 主器件 PH=1、PL=0
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 |= 0x02;///2
UCA0BR1 = 0;//位时钟预分频器设置
UCA0MCTL = 0;//无调制
UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
P1OUT |= BIT3;// nRST_BD 至高电平(BD 未处于复位状态)
while (1){
P1OUT &=~BIT0;//将 nSC_BD 设置为低电平
_DELAY_CYCLES (10);
UCA0TXBUF = 0x0F;//发送地址0x0F (BD 使能寄存器)
while (!(IFG2 & UCA0TXIFG));//等待 TX 缓冲区完成
//__delay_cycles (10);
UCA0TXBUF = 0x5F;//发送数据0x5F 全部使能
while (!(IFG2 & UCA0TXIFG));//等待 TX 缓冲区
_DELAY_CYCLES (10);
P1OUT |= BIT0;//将 nSC_DRV 设置为高电平
_DELAY_CYCLES (10);
}
}
