大侠们,在下第一次使用msp430FR56系例单片机,在spi使用方面遇到点问题。哪位方便帮忙看下,谢谢!
这里使用的是 eUSCI_B口,主模式,数据格式8位MSB传输,时钟信号上升沿采样传递数据。3根线传输数据不使用SET引脚。spi的时钟源来自于SMCK频率1Mhz。
P1.6
P1.7
P2.2
P3.0
这个是系统时钟初始化代码
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
PJSEL0 |= BIT4 + BIT5;
CSCTL0_H = 0xA5;
CSCTL1 |= DCOFSEL_6; // Set max. DCO setting
CSCTL2 = SELA_0 + SELS_3 + SELM_3; // set ACLK = XT1; MCLK = DCO
CSCTL3 = DIVA_0 + DIVS_1 + DIVM_1; // set all dividers
CSCTL4 |= LFXTDRIVE_0;
CSCTL4 &= ~LFXTOFF;
do
{
CSCTL5 &= ~LFXTOFFG;
// Clear XT1 fault flag
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
这是SPI初始化函数
uint8_t System_Spi_B_Init(void)
{
UCB0CTLW0 |= UCSWRST; // **Put state machine in reset**
UCB0CTLW0 |= UCMST; // 3-pin, 8-bit SPI master
UCB0CTLW0 |= UCSYNC;
UCB0CTLW0 |= UCCKPL; // Clock polarity high, MSB
UCB0CTLW0 |= UCMSB;
UCB0CTLW0 |= UCSSEL__SMCLK;
UCB0BR0 = 0x02; // /2
UCB0BR1 = 0; //
UCA0MCTLW = 0; // No modulation
UCB0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
return 0;
}
这是IO引脚功能复用初始化代码
PM5CTL0 &= ~LOCKLPM5;
//Set SPI_IF_Port
P3DIR |= BIT0;
P3REN |= BIT0;
P3OUT |= BIT0; //CS
P2SEL1 |= BIT2; //SPI_B_CLK
P1SEL1 |= BIT6 + BIT7; //SPI_B_MISO\SPI_B_MOSI
#define SPI_CS_H {P3OUT|=BIT0;}
#define SPI_CS_L {P3OUT&=~BIT0}
下面是SPI功能函数
uint8_t SPI_RW(uint8_t byte)
{
uint8_t rec_val;
SPI_CS_L // CS低为片选信号
UCB0TXBUF = byte;
while((UCTXIFG & UCB0IFG) == 0);
while((UCRXIFG & UCB0IFG) == 0);
rec_val = UCB0RXBUF;
UCB0IFG &= ~UCRXIFG;
SPI_CS_H
return rec_val;
}
问题:
我在调试时发现接入从设备后,一个字节没有发完,CS片选引脚电平却自动恢复成高 大概是时钟的第四个上升沿时CS状态发生的变化 。大侠们能不能帮忙看下,附件为完整的工程。