大佬教程收集整理的这篇文章主要介绍了LIS3DSH x y z 轴不正确,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我曾尝试使用 SPI 协议使用 liS3DSH 传感器。我在 STM32L0 探索套件 LoRa 上应用了程序。但是没有用。
我的问题是 liS3DSH x-y-z 轴输出值无效且值未更改。无论我向哪个方向旋转设备,但我检查 liS3DSH 的 ID 是否正确(0011 1111)
组件
STM32L0 探索套件 LoRa
liS3DSH (https://www.amazon.com/LIS3DSH-High-Resolution-Three-axis-Accelerometer-Triaxial/dp/B07QS5D9K9/ref=sr_1_4?dchild=1&keywords=LIS3DSH&qid=1615701212&sr=8-4)
初始化 SPI2
...
@H_607_22@voID HW_SPI2_Init(voID)
{
/*##-1- Configure the SPI2 peripheral */
/* Set the SPI parameters */
hspi2.Instance = SPI2;
hspi2.Init.baudratePrescaler = SpiFrequency(10000000);
hspi2.Init.Direction = SPI_DIRECTION_2lines;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.CLKPolarity = SPI_PolARITY_LOW; // CPol = 0
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; // CPHA = 1
// hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA = 0
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
// hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
hspi2.Init.CRCCalculation = SPI_CRCCALculaTION_disABLE;
hspi2.Init.FirstBit = SPI_FirsTBIT_MSB;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.TIMode = SPI_TIMODE_disABLE;
hspi2.Init.CRCpolynomial = 10;
SPI2_CLK_ENABLE(); // Enable clock for SPI 2
if (HAL_SPi_init(&hspi2) != HAL_OK)
{
/* Initialization Error */
Error_Handler();
}
/*##-2- Configure the SPI GPIOs */
HW_SPI2_IoInit();
}
...
初始化 liS3DSH
@H_607_22@voID HW_SPI2_IoInit(voID)
{
GPIO_InitTypeDef initStruct = {0};
initStruct.Mode = GPIO_MODE_AF_PP;
initStruct.Pull = GPIO_PulLUP ;
initStruct.Speed = GPIO_SPEED_FAST;
initStruct.Alternate = SPI2_AF;
HW_GPIO_Init(liS3DH_SCLK_PORT,liS3DH_SCLK_PIN,&initStruct);
HW_GPIO_Init(liS3DH_MISO_PORT,liS3DH_MISO_PIN,&initStruct);
HW_GPIO_Init(liS3DH_MOSI_PORT,liS3DH_MOSI_PIN,&initStruct);
initStruct.Mode = GPIO_MODE_OUTPUT_PP;
initStruct.Pull = GPIO_nopulL;
HW_GPIO_Init(liS3DH_NSS_PORT,liS3DH_NSS_PIN,&initStruct);
HW_GPIO_Write(liS3DH_NSS_PORT,1);
}
CS 开启或关闭
@H_607_22@voID HW_SPI2_CS_ON (voID)
{
HW_GPIO_Write(liS3DH_NSS_PORT,0);
}
voID HW_SPI2_CS_OFF (voID)
{
HW_GPIO_Write(liS3DH_NSS_PORT,1);
}
读取 ID
@H_607_22@uint8_t liS3DSH_DH_checK_ID (voID)
{
uint8_t addr = liS3Dx_WHO_AM_I_ADDR | liS3Dx_READ;
HW_SPI2_CS_ON();
HW_SPI2_SPI_1byte_Write_and_Read(addr);
HW_SPI2_CS_OFF();
UsingTypeint_liS3DSH_DH.ID = au8BufferRead_SPI2[0];
return UsingTypeint_liS3DSH_DH.ID;
}
读取 X 轴(仅)(不正确)
@H_607_22@voID liS3DSH_DH_GET_XYZ (voID)
{
uint8_t addr = liS3Dx_OUT_X_L_ADDR | liS3Dx_READ ;
HW_SPI2_CS_ON();
HW_SPI2_SPI_1byte_Write_and_Read(addr);
HW_SPI2_CS_OFF();
addr = liS3Dx_OUT_X_H_ADDR | liS3Dx_READ ;
HW_SPI2_CS_ON();
HW_SPI2_SPI_1byte_Write_and_Read(addr);
HW_SPI2_CS_OFF();
}
HW_SPI2_1byte_Write_and_Read
@H_607_22@bool HW_SPI2_SPI_1byte_Write_and_Read(uint8_t u8Address)
{
if(HAL_SPI_Transmit(&hspi2,(uint8_t *)&u8Address,1,HAL_MAX_DELAY) == HAL_OK){
if(HAL_SPI_Receive(&hspi2,(uint8_t *)&au8BufferRead_SPI2[0],HAL_MAX_DELAY) == HAL_OK){
return true;
}
}
return false;
}
信号
output X L
output X H
不确定您是否在使用状态机并准确注册 LIS3DSH 的访问。
作为参考,请参阅 https://github.com/STMicroelectronics/stm32-lis3dsh/blob/main/lis3dsh.h 中的寄存器映射(从第 95 行开始)和 https://github.com/STMicroelectronics/stm32-lis3dsh/blob/main/lis3dsh.c 中的代码
实际读写SPI总线的函数是void ACCELERO_IO_Write(uint8_t *pBuffer,uint8_t WriteAddr,uint16_t numbyteToWritE)
和void ACCELERO_IO_Read(uint8_t *pBuffer,uint8_t ReadAddr,uint16_t numbyteToRead)
这在 https://documentation.Help/STM32F4-Discovery-BSP/stm32f4__discovery_8c_source.html 中的第 560 和 594 行定义
在 void ACCELERO_IO_Write(uint8_t *pBuffer,uint16_t numbyteToWritE)
中,实际的 SPI 写入在第 574 至 582 行完成
00574 SPIx_WriteRead(WriteAddr);
00577 while(numbyteToWrite >= 0x01)
00578 {
00579 SPIx_WriteRead(*pBuffer);
00580 numbyteToWrite--;
00581 pBuffer++;
00582 }
(和往常一样,SPI 先激活寄存器,然后写入数据...)
在 SPIx_WriteRead(WriteAddr);
中,WriteAddr
取自 https://github.com/STMicroelectronics/stm32-lis3dsh/blob/main/lis3dsh.h 中的寄存器映射,从第 9 行开始
(上面STM为LIS3DSH编写的代码很好,这个实现非常干净和结构化)
LIS3DSH 的数据表在 https://www.st.com/resource/en/datasheet/lis3dsh.pdf 中,参考手册更详细,在 https://www.st.com/resource/en/application_note/dm00026768-lis3dsh-3axis-digital-output-accelerometer-stmicroelectronics.pdf 中还包括状态机的解释,必须在设备工作前进行配置
以上是大佬教程为你收集整理的LIS3DSH x y z 轴不正确全部内容,希望文章能够帮你解决LIS3DSH x y z 轴不正确所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。