西祠响马 发表于 2019-3-28 13:23:39

加速度传感器LIS3DH与STM32F103通讯问题

定义了一个数据buffer,然后通过SPI总线从传感器读数据。每10ms从传感器读数据,读的时候使用监视状态寄存器并等待的方式。这里面有几个中断 ADC、TIM1主要问题有:1.             读入的数据总是错位,本来在buffer的数据有时会到buffer,后来改在ADC中断中进行处理,数据倒是不会转移了。读取的数据如下读取地址 27h,长度7
Buffer正确数据我读取的数据
buffer0FFF
buffer000F
buffer0000
buffer0000
buffer0000
buffer0000
buffer0000
好像是读取了一个无效的数据。2.             使用DMA,但不在中断中执行的效果和(1)相同3.             读出来的好像是位置数据,需要做什么处理吗?手册上说的是振动数据。部分程序:SPI 初始化   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线双向全双工,还有半双工以及串行发和串行收方式   SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主 SPI还有副 SPI   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI 发送接收8或者16位帧结构   SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串行同步时钟的空闲状态为高电平或者低电平   SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第一个或者第二个跳变沿数据被采样SPI_InitStructure.SPI_NSS= SPI_NSS_Soft; //NSS 信号由软件控制SPI_InitStructure.SPI_BaudRatePrescaler= SPI_BaudRatePrescaler_8; //预分频 256SPI_InitStructure.SPI_FirstBit= SPI_FirstBit_MSB; //数据传输从 MSB 位开始SPI_InitStructure.SPI_CRCPolynomial= 7; //CRC 值计算的多项式SPI_Init(SPI3,&SPI_InitStructure); //根据指定的参数初始化外设 SPIx 寄存器SPI_Cmd(SPI3,ENABLE);//使能SPI外设 voidInitLIS3DH(void){response = LIS3DH_WriteReg(LIS3DH_CTRL_REG1,0x57);         // 100Hzresponse =LIS3DH_WriteReg(LIS3DH_CTRL_REG2, 0); //高通滤波模式response =LIS3DH_WriteReg(LIS3DH_CTRL_REG3, 0);response =LIS3DH_WriteReg(LIS3DH_CTRL_REG4, 0); //正常模式,+-2g,低位在低字节}数据处理 ADC中断中执行voidProcLis3dh(void){response =LIS3DH_ReadReg(LIS3DH_STATUS_REG,&buffer);          if(buffer & 0x08)          {                   View = (((INT16S)buffer<< 8) + buffer) >> 6;                   View = (((INT16S)buffer<< 8) + buffer) >> 6;                   View = (((INT16S)buffer<< 8) + buffer) >> 6;          }}u8_tLIS3DH_ReadReg(u8_t Reg, u8_t* Data) { INT8U i = 0,j = 0,k = 0;    ZHD_CS_0; SPI_FLASH_DMAMode(1);    while ((SPI3->SR &SPI_I2S_FLAG_TXE)== RESET);    SPI3->DR = Reg | 0xc0; for(i = 0; i <= 7;i++) {     while ((SPI3->SR & SPI_I2S_FLAG_TXE)== RESET) {          j++;          if(j>20)          {                   return(0);          } }          SPI3->DR = 0xFF;    while( SPI_I2S_GetFlagStatus( SPI3,SPI_I2S_FLAG_RXNE ) == RESET ) {          k++;          if(k>20)          {                   return(0);          } }                   *Data++ = SPI3->DR; }                SPI_FLASH_DMAMode(0); ZHD_CS_1;return 1;} voidSPI_FLASH_DMAMode(u8 enable){    if(0 == enable)    {      RCC->APB1RSTR |=RCC_APB1RSTR_SPI3RST;      RCC->APB1RSTR &=~(RCC_APB1RSTR_SPI3RST);      SPI3->CR1 =SPI_CR1_CPHA|SPI_CR1_CPOL|SPI_CR1_MSTR|SPI_CR1_SPE|SPI_CR1_SSI|SPI_CR1_SSM|SPI_CR1_BR_1;             SPI3->I2SCFGR &= ~(SPI_I2SCFGR_I2SMOD);   }    else    {      SPI3->CR2 |= SPI_CR2_RXDMAEN;          }
}希望有高手不吝赐教,感激不尽!

一代睡神的崛起 发表于 2019-3-28 13:43:33

看来是数据错位了呀,怎么最高位还是F填充?没玩过这个MEMS等会儿去看看手册

衔胆栖冰 发表于 2019-3-28 21:48:47

SPI同步通信,发送和接收是同时的,发送第一个字节(地址)的同时会返回一个无效数据,再发下一个时钟才能得到正确的数据。多看数据手册,这些东西一般没啥难度,根据手册操作就行。

西祠响马 发表于 2019-3-29 13:03:31

一代睡神的崛起 发表于 2019-3-28 13:43
看来是数据错位了呀,怎么最高位还是F填充?没玩过这个MEMS等会儿去看看手册 ...

好的,我也再去看看手册。有啥收获麻烦及时指教:lol

西祠响马 发表于 2019-3-29 13:04:07

衔胆栖冰 发表于 2019-3-28 21:48
SPI同步通信,发送和接收是同时的,发送第一个字节(地址)的同时会返回一个无效数据,再发下一个时钟才能 ...

嗯嗯,好的,这就去反复看手册:'(

edmundlee 发表于 2019-3-29 13:36:59

本帖最后由 edmundlee 于 2019-3-29 13:39 编辑

我之前也碰到过类似的问题, 不知道是否跟楼主的同一个问题
SPI有分4个不同的模式, 比如是上升沿读还是下降沿读, 比如空闲状态是高还是低, 看清楚传感器的规格书, 然后把SPI的配置跟上。
另外, 如果把传感器的CE在上电后先禁能几十个微秒后再使能, 可以防止上电时误触发时钟信号, 引至移位。

页: [1]
查看完整版本: 加速度传感器LIS3DH与STM32F103通讯问题