430的SPI还是很简单的,首先你430的SPI程序调通了没有。可以通过回环方式测试下SPI工作是否正常。至于例程,网上好多的。
我这里给你一个初始化的例子吧
void Usart0SpiInit(void)
{
#if USART0_SPI_MODE == eSpiModeMaster
uint16_t u0br = 0; // 主机模式根据波特率计算时钟分频系数
#if USART0_SPI_CLKSRC == eSpiClkSrcSMclk
u0br = SMCLK_Hz / USART0_SPI_BAUD_RATE; // SMCLK
#elif USART0_SPI_CLKSRC == eSpiClkSrcAclk
u0br = ACLK_Hz / USART0_SPI_BAUD_RATE; // ACLK
#else
u0br = USART0_SPI_UCLK_Hz / USART0_SPI_BAUD_RATE;// EXUCLK?
#endif
if(u0br < 2) // 当分频系数小于 2 时,会发生意想不到的错误(官方文档)
u0br = 2; // 分频系数最小为 2
#endif
P1SEL |= BIT5 | BIT6 | BIT7; // 使能 SPI 引脚功能
P1SEL2 |= BIT5 | BIT6 | BIT7;
#if USART0_SPI_MODE == eSpiModeSlave
P2SEL |= BIT0; // 从机模式时,片选脚也使能
P2SEL2 |= BIT0;
#endif
U0CTL = SWRST; // 复位 USART0
#if USART0_SPI_MODE == eSpiModeMaster
U0CTL |= SYNC | MM | USART0_SPI_CHAR_LENGTH | USART0_SPI_LOOPBACK;
U0TCTL = USART0_SPI_CKPH | USART0_SPI_CKPL | USART0_SPI_CLKSRC | STC;
U0BR0 = u0br & 0xFF;
U0BR1 = (u0br >> 8) & 0xFF;
#else
U0CTL |= SYNC | USART0_SPI_CHAR_LENGTH;
U0TCTL = USART0_SPI_CKPH | USART0_SPI_CKPL | USART0_SPI_STE_PIN;
#endif
U0RCTL = 0;
U0MCTL = 0;
ME1 |= USPIE0; // 使能 USART0
U0CTL &= ~SWRST; // 清楚复位标志
#if USART0_SPI_MODE == eSpiModeSlave
IE1 |= URXIE0; // 从机模式开启中断
U0TXBUF = USART0_SPI_ACK_INVALID; // 准备好返回的数据
#endif
}
|