调试MSP430F149与ADXL345 SPI通信时,大部分情况下(90%以上的几率),程序停留在语句“while (!(IFG1 & URXIFG0)); ”无法继续运行;
当把电路图中串联的51Ω换成0Ω,无法继续运行的情况能少一些(大概50%吧),不知道什么原因
电路图如下:
程序如下:
void main(void)
{
…
init_IO(); // 初始化IO端口
/*********初始化SPI0、ADXL345,读取设备ID*******/
InitSPI0();
delay_1ms(2);
ADXL345_Init();
RX_ad345ID = SPIByteRead(0x00); // 读取设备ID
…
while(1)
{ }
}
/*******************************************
函数名称:InitSPI0
功 能:初始化SPI0模块
参 数:无
返回值 :无
********************************************/
void InitSPI0(void)
{
U0CTL |= CHAR + SYNC + MM; // 8-bit, SPI, Master
U0TCTL = CKPL + SSEL1 + SSEL0; // Polarity, SMCLK, 4-wire
U0BR0 = 0x02; // SPICLK = SMCLK/2
U0BR1 = 0x00;
U0MCTL = 0x00; // SPI模式时不使用,推荐设置成000
ME1 |= USPIE0; // Module enable
U0CTL &= ~SWRST; // SPI enable
}
/**************************************************************
函数名称:init_IO
功 能:初始化3维振动记录仪的所有的IO端口,包括用到的和没用的
参 数:无
返回值 :无
***************************************************************/
void init_IO()
{
…
P3SEL |= BIT1 + BIT2 + BIT3; // P3.0,1,2,3 = SPI0 STE/SIMO0/SOMI0/UCLK
P3DIR &= ~BIT2; // P3.2,SPI0 SOMI0,input
P3OUT |= BIT0; // P3.0 = STE,置高
…
}
/**************************************************************
函数名称:void ADXL345_Init(void)
功 能:ADXL345初始化程序
参 数:无
返回值 :无
***************************************************************/
void ADXL345_Init()
{
SPIByteWrite(XL345_POWER_CTL,0x00);
…
SPIByteWrite(XL345_POWER_CTL,0x08); // 测量为置1,设置为测量模式
}
/**************************************************************
函数名称:unsigned char SPIByteRead(unsigned char addr)
功 能:SPI模块读取一个字节的数据
参 数:unsigned char spi_data
返 回 值:无
***************************************************************/
unsigned char SPIByteRead(unsigned char addr)
{
unsigned char tempdata,a;
addr |= 0x80; // ADXL345读取时数据时,地址的MSB是1
P3OUT &= ~BIT0; // 片选STE0置低
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = addr;
while (!(IFG1 & URXIFG0)); //等待发送结束 ——->程序停留在此语句,无法继续运行
a = RXBUF0; // 复位IFG1->URXIFG0
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = 0xFF;
while (!(IFG1 & URXIFG0)); // 等待发送结束
tempdata = RXBUF0;
P3OUT |= BIT0; // 片选STE0置高
return tempdata;
}
灰小子:
你的pcb上,spi走线是不是比较长啊?
你加上拉电阻试试。51R电阻一般不需要加。
user1813602:
回复 灰小子:
你好,谢谢你的回答。我试过上拉电阻,效果不怎么理想,还是会出现同样的状况。