你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407测试Lis3dh加速度传感器

[复制链接]
hou199 提问时间:2020-11-26 14:25 /
我使用开发板测试加速度传感器,测试中发现SPI只能发送数据,接受不到数据,应该是没有和lis3dh加速度传感器接通,哪位大神帮我看一下代码有什么问题?
int main(void)
{
        AxesRaw_t data;
        u8 lisid;
        SystemInit();
        delay_init(168);    //初始化延时函数
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);         //串口初始化
        IO_Init();
        LED_Init();
        SPI1_FLASH_Init();//SPI初始化
        lis3dhinit();//三轴加速度传感器初始化
//        LIS3DH_GetWHO_AM_I(&lisid);//获取三轴加速度传感器地址
        while(1)
        {

                LIS3DH_GetAccAxesRaw(&data);//获得三轴的数据
                printf ( "accel:[x]%dmg,[y]%dmg,[z]%dmg\r\n",
(int)((float)data.AXIS_X*4/65536*1000),
(int)((float)data.AXIS_Y*4/65536*1000),
(int)((float)data.AXIS_Z*4/65536*1000));
                delay_ms(1000);//延时
        }
       
}

void SPI1_FLASH_Init(void)
{
       
        GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
       
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟

  //GPIOFB3,4,5初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5复用功能输出       
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
       
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3复用为 SPI1
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); //PB4复用为 SPI1
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //PB5复用为 SPI1

        //这里只针对SPI口初始化
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

        SPI_Cmd(SPI1, ENABLE); //使能SPI外设
        LIS3DH_CS=1;                        //SPI FLASH不选中
        SPI1_ReadWriteByte(0xff);//启动传输,可以不要
        //SPI1_SetSpeed(SPI_BaudRatePrescaler_4);
}
//SPI1速度设置函数
//SPI速度=fAPB2/分频系数
//@ref SPI_BaudRate_Prescaler:SPI_BaudRatePrescaler_2~SPI_BaudRatePrescaler_256  
//fAPB2时钟一般为84Mhz:
void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性
        SPI1->CR1&=0XFFC7;//位3-5清零,用来设置波特率
        SPI1->CR1|=SPI_BaudRatePrescaler;        //设置SPI1速度
        SPI_Cmd(SPI1,ENABLE); //使能SPI1
}
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{                                          

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空  
       
        SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte  数据
               
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte  

        return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据       
                    
}

void IO_Init()
{
        GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);//使能GPIOG时钟

          //GPIOB14
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;//PB14
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//PG7
  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化

        GPIO_SetBits(GPIOG,GPIO_Pin_7);//PG7输出1,防止NRF干扰SPI FLASH的通信
       



}

void lis3dhinit(void)
{

u8 response=0;
response = LIS3DH_SetODR(LIS3DH_ODR_100Hz);//设置输出频率
//printf("设置 ODR:%d\r\n",response);
response = LIS3DH_SetMode(LIS3DH_NORMAL);//设置工作模式
//printf("设置 MODE:%d\r\n",response);
response = LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2);
//printf("设置 SCALE:%d\r\n",response);
response = LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE);//设置三轴使能
response = LIS3DH_SetSPIInterface(LIS3DH_SPI_4_WIRE);//设置SPI为4线
//printf("设置 ENABLE:%d\r\n",response);
//LIS3DH_SetInt1Threshold(0x59);
//LIS3DH_SetIntConfiguration(LIS3DH_INT1_ZHIE_ENABLE | LIS3DH_INT1_ZLIE_ENABLE |
//                                           LIS3DH_INT1_YHIE_ENABLE | LIS3DH_INT1_YLIE_ENABLE |
//                                           LIS3DH_INT1_XHIE_ENABLE | LIS3DH_INT1_XLIE_ENABLE );
//LIS3DH_SetIntMode(LIS3DH_INT_MODE_6D_MOVEMENT);
//LIS3DH_SetInt1Pin(LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE);       
delay_ms(100);
}

u8_t LIS3DH_WriteReg(u8_t WriteAddr, u8_t Data)
{

  //To be completed with either I2c or SPI writing function
  //i.e. SPI_Mems_Write_Reg(WriteAddr, Data);  
  LIS3DH_CS=0;
        delay_us(1);
  SPI_SendData(SPI1,WriteAddr);
  SPI_SendData(SPI1,Data);
  delay_us(1);
  LIS3DH_CS=1;  
        return 1;
}

u8_t LIS3DH_ReadReg(u8_t Reg, u8_t* Data) {

  //To be completed with either I2c or SPI reading function
  //i.e. *Data = SPI_Mems_Read_Reg( Reg );  
        LIS3DH_CS=0;
        delay_us(1);
  SPI1_ReadWriteByte((0x80|Reg));
        *Data=SPI1_ReadWriteByte(0xff);
        delay_us(1);
  LIS3DH_CS=1;

  return 1;
}


收藏 评论1 发布时间:2020-11-26 14:25

举报

1个回答
小歆-2051663 回答时间:2020-11-26 16:32:13
建议你使用CubeMX创建项目,使用HAL库更方便,标准库官方已经不再维护了。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版