This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430F5500:LIS3DH 始终将 SPI I/F 上的0xFF 返回到 MSP430F5500

Guru**** 2582405 points
Other Parts Discussed in Thread: MSP430F5500

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/593640/ccs-msp430f5500-lis3dh-always-returns-0xff-on-spi-i-f-to-msp430f5500

器件型号:MSP430F5500

工具/软件: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 寄存器会首先提供给我。  这是正常现象还是我错过了什么?

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    单个 SPI 传输始终写入一个字节并读取一个字节、因此在 RXBUF 中之后将有一个新字节、并且 RXIFG 将被置位。 这意味着您正在读取发送地址时接收到的字节。

    此外、即使前一个字节仍在发送中、也可以将一个字节写入 TXBUF。 这意味着您不能使用 TXIFG 来检查总线上的事务何时完成,而 writeRegister()过早地取消选择 CS。

    处理 SPI 的最简单方法是使用一个单一的函数来执行写入和读取操作、并确保 RXIFG 在执行后始终被清零:

    uint8_t spiTransfer (uint8_t writeData)
    {
    while (!(UCA1IFG & UCTXIFG));//等待 TX 缓冲区就绪
    UCA1TXBUF = writeData;
    while (!(UCA1IFG & UCRXIFG));//等待 RX 缓冲区就绪
    返回 UCA1RXBUF;
    }
    
    void setWriteMode (uint8_t addr)
    {
    spiTransfer (addr | 0x00);
    }
    
    void setReadMode (uint8_t addr)
    {
    spiTransfer (addr | 0x80);
    }
    
    void writeByte (uint8_t data)
    {
    spiTransfer (data);
    }
    
    uint8_t readByte ()
    {
    返回 spiTransfer (0xAA);
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我再次看到0xFF 的值、硬件部件是否会出现问题? )
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题得到解决非常感谢:):):)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、我遇到了同样的问题。 您能告诉我您是如何解决该问题的?