主题中讨论的其他部件:AFE4300
我正在尝试将MSP430启动板与AFE4300评估板连接起来,以建立SPI通信。 我知道我的硬件连接是正确的,就像使用相同的连接一样,我可以从提供的AFE4300 GUI中读取和写入AFE中的寄存器,AFE4300也使用SPI。
下面是我的代码。 该代码尝试将0x0408写入0x0A寄存器,然后读取该地址的值。 我用示波器探测Miso,MOSI,SCLK和STE (WFP 5.0)的信号。 问题仅与味增有关。 当STE变低时,Miso会变高。 当MSP430开始传输时,它将返回零。 在下次STE降低之前,它将保持低电平。 我检查了状态标志。 我会遇到超限错误。 为了纠正这种情况,我在ISR内添加了这一行代码(在某个论坛上看到有人使用它),"同时(UCB0STAT和UCBUSY);"。 我的传输缓冲区采用正确的值并正确传输,但我始终读取零。 请帮我解决问题。 我本来会使用eUSI_A0而不是eUSI_B0进行验证,但是MSP430的启动板在WFP 1.2 上有一个复位按钮,在WFP 1.0 上有一个红色LED。
#include <MSP4S.h>
无符号字符RXData =0;
未签名的char TXData;
内部主(无效)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P5SEL0 || BIT1 | BIT2 | BIT3; //将3-SPI引脚设置为第二个函数
UCB0CTLW0 |= UCSWRST; //**将状态机置于复位**
// 4引脚,8位SPI主控
UCB0CTLW0 |= UCMST|UCSYNC|UCCKPH|UCMSB|UCMODE_1|UCSTEM;
//时钟极性高,MSB
UCB0CTLW0 |= UCSSEL__SMCLK; //选择SMCLK
UCB0BR0 = 0x04; ///2,fBitClock = fBRCLK/(UCBRx+1)。 SCLK的时间段为4US
UCB0BR1 = 0;
//UCA0MCTLW = 0; //无调制
UCB0CTLW0 &=~UCSWRST; //**初始化USCI状态机**
PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式 以激活先前配置的端口设置
P5DIR || BIT0; //芯片选择
//将0x0408写入0x0A寄存器
P5OUT &=~BIT0; //芯片选择低
TXData = 0x0A; //选择要传输的地址
UCB0IE |= UCTXIE; //启用TX中断
__bis_sr_register(GIE);//启用中断
__DELAY周期(100); //下一次传输前的延迟
TXData = 0x04; //选择要传输的MSB
UCB0IE |= UCTXIE; //启用TX中断
__bis_sr_register(GIE);//启用中断
__DELAY周期(100);
TXData = 0x08; //传输LSB
UCB0IE |= UCTXIE; //启用TX中断
__bis_sr_register(GIE);//启用中断
__DELAY周期(100); //下一次传输前的延迟
P5OUT |= BIT0; //芯片选择高
__DELAY周期(100);
//从同一个寄存器读取
P5OUT &=~BIT0; //芯片选择低
//将TXdata发送到缓冲区
TXData =(0x20 | 0x0A); //保留启用了读取位的地址
UCB0IE |= UCTXIE; //启用TX中断
__bis_sr_register(GIE); //启用中断
__DELAY周期(100); //下一次传输前的延迟
UCB0IE |= UCRXIE; //启用USI_B0 RX中断
__bis_sr_register(GIE); //启用中断
TXData = 0x00; //传输虚拟数据
UCB0IE |= UCTXIE; //启用TX中断
__bis_sr_register(GIE); //启用中断
__DELAY周期(100); //下一次传输前的延迟
//接收MSB
UCB0IE |= UCRXIE; //启用USI_B0 RX中断
__bis_sr_register(GIE); //启用中断
TXData = 0x00; //传输虚拟数据
UCB0IE |= UCTXIE; //启用TX中断
__bis_sr_register(GIE);//启用中断
__DELAY周期(100); //下一次传输前的延迟
//接收LSB
UCB0IE |= UCRXIE; //启用USI_B0 RX中断
__bis_sr_register(GIE);//启用中断
//芯片选择高
P5OUT |= BIT0;
__DELAY周期(100);
}
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USI_B0_vector
__interrupt void USI_B0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_B0_vector)) USI_B0_ISR (void)
#否则
错误编译器不受支持!
#endif
{
Switch(__偶 数_in_range(UCB0IV,USI_SPI_UCTXIFG))
{
案例USI_NONE:Break;// Vector 0 - NO INTERRUPT
案例USI_SPI_UCRXIFG:
期间(UCB0STAT和UCBUSY);
RXData = UCB0RXBUF;
UCB0IFG &=~UCRXIFG;
中断;
案例USI_SPI_UCTXIFG:
UCB0TXBUF = TXData;//传输字符
UCB0IE &=~UCTXIE;
中断;
默认值:中断;
}
}
