尊敬的先生/女士
我尝试使用 SPI 将 ADXL345加速计与 msp430fr5994连接。 当我运行程序时、我将在发送缓冲区获得0xFF 的虚拟值。我在这里共享代码。我已将头文件用作标准 MASTER_SPI 的 SDK。 请解决我的错误。
#include
#include
#include
#include
#include
unsigned char addr[30]="";
空 initSPI()
{
//时钟极性:无效状态为高电平
//MSB 优先、8位、主器件、3引脚模式、同步
UCB1CTLW0 = UCSWRST;//**将状态机复位
UCB1CTLW0 |= UCCKPL | UCMSB | UCSYNC
| UCMST | UCSSEL_SMCLK;// 3引脚8位 SPI 从 SMCLK=16MHz
UCB1BRW = 0x160;//16000000 / 160=100kHz
//UCB1MCTLW = 0;
UCB1CTLW0 &=~UCSWRST;//**初始化 USCI 状态机**
UCB1IE |= UCRXIE;//启用 USCI0 RX 中断
}
空 initGPIO()
{
//LED
comms_LED_DIR |= comms_LED_PIN;
comms_LED_OUT &=~comms_LED_PIN;
button_LED_DIR |= button_LED_PIN;
button_LED_OUT &=~button_LED_PIN;
//配置 SPI
P5SEL0 |= BIT0 | BIT1 | BIT2;
SLAVE_RST_DIR |= SLAVE_RST_PIN;
SLAVE_RST_OUT |= SLAVE_RST_PIN;
SLAVE_CS_DIR |= SLAVE_CS_PIN;
SLAVE_CS_OUT |= SLAVE_CS_PIN;
//按钮启动传输
button_DIR &=~(button_PIN);// Button 输入
button_out |= button_PIN;// Button pullup
button_REN |= button_PIN;//按钮上拉/下拉电阻使能
button_IES |= button_PIN;//按钮高/低边沿
button_IE |= button_PIN;//启用按钮中断
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
button_IFG &=~button_PIN;//清除 Button IFG
}
空 initClockTo16MHz()
{
//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;
//时钟系统设置
CSCTL0_H = CSKKEY_H;//解锁 CS 寄存器
CSCTL1 = DCOFSEL_0;//将 DCO 设置为1MHz
//设置 SMCLK = MCLK = DCO、ACLK = LFXTCLK (如果 VLOCLK 不可用)
CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;
//每个器件勘误表在将频率更改为之前将分频器设置为4
//防止因过冲瞬态而超出规格运行
CSCTL3 = DIVA__4 | DIVM_4;//针对勘误表将所有相应的时钟源设置为4分频
CSCTL1 = DCOFSEL_4 | DCORSEL;//将 DCO 设置为16MHz
//延迟~10us 以使 DCO 稳定。 60个周期= 20个周期缓冲器+(10us /(1/4MHz))
_DELAY_CYCLLES (60);
CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;//针对16MHz 运行将所有分频器设置为1
CSCTL0_H = 0;//锁定 CS 寄存器
}
int adxl_device_id ()
{
unsigned int id;
SPI_Master_ReadReg (CMD_TYPE_0_SLAVE、TYPE_0_LENGTH);
id=ReceiveBuffer[0];
退货 ID;
}
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
initClockTo16MHz();
initGPIO();
initspi();
SLAVE_RST_OUT 和=~SLAVE_RST_PIN;//现在已初始化 SPI 信号、
_DELAY_CYCLES (100000);
SLAVE_RST_OUT |= SLAVE_RST_PIN;//复位从器件
_DELAY_CYCLES (100000);//等待从器件初始化
comms_LED_OUT |= comms_LED_PIN;
while (1)
{
int adxl_id;
adxl_id=adxl_device_id ();
}
返回0;
}