工具/软件:Code Composer Studio
我正在尝试通过 SPI İnterface 配置 LIS3DH 芯片。 以下是我的代码:
#include
#include
#include
#include
#include
#define CS BIT3 //端口4,位3
#define SELEC() DO { P4OUT &=~CS;unsigned int a;for (a=50;a>0;A-);} while (0)
#define DESELECT () DO { P4OUT |= CS;} while (0)
#define LIS3DH_REG_WHOami 0x0F
#define I_AM_LIS3DH ((uint8_t) 0x33)
#define LIS3DH_REG_CTRL1 0x20
#define LIS3DH_REG_CTRL2 0x21
#define LIS3DH_REG_CTRL3 0x22
#define LIS3DH_REG_CTRL4 0x23
#define LIS3DH_REG_CTRL5 0x24
#define LIS3DH_REG_CTRL6 0x25
#define LIS3DH_REG_OUT_X_L 0x28
#define LIS3DH_REG_OUT_Y_L 0x2A
#define LIS3DH_REG_OUT_Z_L 0x2C
typedef 结构{
float accel_x;
float accel_y;
float accel_z;
}accel_str;
void InitSPI (void);
INT8_t InitMEMS (void);
void setWriteMode (uint8_t addr);
void writeByte (uint8_t data);
void setReadMode (uint8_t addr);
uint8_t readByte ();
空读取(uint8_t* ReadData、uint8_t addr、uint8_t numBytes);
void writeRegister (uint8_t addr、uint8_t data);
void accelLoad (accel_str* x_accel);
Accel_str x_accel;//包含所有传感器输出的主加速器结构
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
InitSPI();
InitMEMS ();
accelLoad (&x_accel);//获取加速计结果
}
/* P4.5–UCA1SOMI
P4.4–UCA1SIMO
P4.0–UCA1CLK
P4.3 - ChipSelect *
void InitSPI (void){
P4SEL |= BIT0 + BIT4 + BIT5;
P4OUT |= BIT3;
P4DIR |= BIT3;
UCA1CTL1 |= UCSWRST;
UCA1CTL0 = UCCKPL | UCMSB | UCMST | UCMODE_0 | UCSYNC;
UCA1CTL1 = UCSSEL_2;
UCA1BR0 = 32;
UCA1BR1 = 0;//
UCA1MCTL = 0;//无调制
UCA1CTL1 &=~UCSWRST;
}
INT8_t InitMEMS (void){
uint8_t deviceId;
read(&deviceId, LIS3DH_REG_WHOAM, 1);//首先检测是否连接了模块
if (deviceId!= I_AM_LIS3DH)
返回-1;//error
writeRegister (LIS3DH_REG_CTRL1、0x57);//所有轴、正常、100Hz
writeRegister (LIS3DH_REG_CTRL2、0x00);//无高通滤波器
writeRegister (LIS3DH_REG_CTRL3、0x00);//无中断
writeRegister (LIS3DH_REG_CTRL4、0x00);//所有默认值
writeRegister (LIS3DH_REG_CTRL5、0x00);//所有默认值
writeRegister (LIS3DH_REG_CTRL6、0x00);//所有默认值
返回1;//成功
}
/**
*写入初始字节
*
void setWriteMode (uint8_t addr){
while (!(UCA1IFG & UCTXIFG));// TX 缓冲区准备就绪?
UCA1TXBUF =(addr | 0x00);// 1 =读取/ 0 =写入
while (!(UCA1IFG & UCTXIFG));// TX 缓冲区准备就绪?
}
/**
*写入一个字节
*
void writeByte (uint8_t data){
while (!(UCA1IFG & UCTXIFG));// TX 缓冲区准备就绪?
UCA1TXBUF = DATA;//发送数据
while (!(UCA1IFG & UCTXIFG));// TX 缓冲区准备就绪?
}
/**
*读取单字节
*
void setReadMode (uint8_t addr){
while (!(UCA1IFG & UCTXIFG));// TX 缓冲区准备就绪?
UCA1TXBUF =(addr | 0x80);// 1 =读取/ 0 =写入
while (!(UCA1IFG & UCTXIFG));// TX 缓冲区准备就绪?
}
uint8_t readByte (){
while (!(UCA1IFG & UCTXIFG));// TX 缓冲区准备就绪?
UCA1TXBUF = 0xAA;//发送垃圾
while (!(UCA1IFG & UCTXIFG));// TX 缓冲区准备就绪?
while (!(UCA1IFG & UCRXIFG));//接收到 RX?
返回 UCA1RXBUF;//存储接收到的数据
}
/**
*从特定地址读取任意数量的字节。 请确保
*在后续读取后、传感器将自动递增其寄存器指针
*
void read (uint8_t* ReadData、uint8_t addr、uint8_t numBytes){
uint8_t i;
select();
setReadMode (addr);
for (i = 0;i!= numBytes;i++){
*ReadData = readByte();
ReadData++;//增加到下一个地址
}
取消选择();
}
/**
*将单字节写入单个寄存器
*
void writeRegister (uint8_t addr、uint8_t data){
select();
setWriteMode (addr);
writeByte (data);
取消选择();
}
/**
*获取所有3轴加速计读数。 从 mg 转换为 g
*
void accelLoad (accel_str* x_accel){
int16_t tmp;
读取((uint8_t*)&tmp、LIS3DH_REG_OUT_X_L、2);
x_accel->accel_x =(tmp * 0.061)/ 1000.0;
读取((uint8_t*)&tmp、LIS3DH_REG_OUT_Y_L、2);
x_accel->accel_y =(tmp * 0.061)/ 1000.0;
read((uint8_t*)&tmp,LIS3DH_REG_OUT_Z_L,2);
x_accel->accel_z =(tmp * 0.061)/ 1000.0;
}
问题:具有地址 0x0F 的 lis3dh 寄存器保持恒定51 (某个设备的类型)。 当我 0xFF 通过 SPI 接口发送读取该寄存器的请求(寄存器地址加上设置 MSB 位)时、Msp430f5500 SPI RX 寄存器会首先提供给我。 这是正常现象还是我错过了什么?