定义了一个数据buffer[10],然后通过SPI总线从传感器读数据。 每10ms从传感器读数据,读的时候使用监视状态寄存器并等待的方式。 这里面有几个中断 ADC、TIM1 主要问题有: 1. 读入的数据总是错位,本来在buffer[1]的数据有时会到buffer[2],后来改在ADC中断中进行处理,数据倒是不会转移了。读取的数据如下 读取地址 27h,长度7
好像是读取了一个无效的数据。 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; //预分频 256 SPI_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); // 100Hz response = 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[0]); if(buffer[1] & 0x08) { View[6] = (((INT16S)buffer[3]<< 8) + buffer[2]) >> 6; View[7] = (((INT16S)buffer[5]<< 8) + buffer[4]) >> 6; View[8] = (((INT16S)buffer[7]<< 8) + buffer[6]) >> 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; } } 希望有高手不吝赐教,感激不尽! |
STM32F107+LWIP---如何检查tcp通讯断开?并重新连接
有没有用过数字式mems麦克风的,想问下SPI通讯的问题
stm32f103 CAN通讯多帧发送问题?
STM32F107作为USB主机模拟串口通讯不成功(采用PL2303芯片)
STM32F103C8 LIN通讯例程
求助,丐版J-Link通讯不上
ethernet可以与ethercat通讯吗?
LIS3DH SPI 通讯问题
STM32F373 CAN通讯问题CAN_FLAG_LEC
请教高手看看,STM32F1的多机通讯,地址匹配唤醒问题
评分
查看全部评分
评分
查看全部评分
好的,我也再去看看手册。有啥收获麻烦及时指教
嗯嗯,好的,这就去反复看手册
我之前也碰到过类似的问题, 不知道是否跟楼主的同一个问题
SPI有分4个不同的模式, 比如是上升沿读还是下降沿读, 比如空闲状态是高还是低, 看清楚传感器的规格书, 然后把SPI的配置跟上。
另外, 如果把传感器的CE在上电后先禁能几十个微秒后再使能, 可以防止上电时误触发时钟信号, 引至移位。
评分
查看全部评分