STM32F4驱动ADIS16500驱动

最近公司产品需要使用ADIS16500,网上搜索,发现资料很少,借鉴ADIS16445代码,最终调试完成,记录下调试过程中遇到的问题,希望能让后面使用的人不要踩坑。

1.配置成spi的mode3模式,我使用的是SPI2时钟频率50M,ADIS16500要求小于2M,所以要32分频,16分频测试会有误码

 SPI_InitTypeDef SPI_InitStructure;
    // SPI初始化 --------------------------------------------------------------//
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;

2.配置DR引脚为中断引脚,手册中写的是低电平有效,但是配置中断是要配置成上升沿,这点一定要注意    EXTI_InitStructure.EXTI_Line = EXTI_Line8;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //这里要注意
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

3.单寄存器读取函数

uint16_t AdisReadRegValue(uint16_t addr)
{        
        uint16_t value;
    
        ADIS_CS_LOW();
         value = ADIS_SEND_BYTE(ADIS_COMM_READ |  addr);
        ADIS_CS_HIG();
        return value;
}

读取芯片型号测试通信成功后再做后面的工作

 RegVer = AdisReadRegValue(0x7200);
    if(RegVer != 0x4074)
    {
        return False;
    }
    return True;

4.默认16位burst读取,读取数据并校验数据是否正确

#define ADIS_READ_BYTE()          DrvSpiSendData(ADIS_SPI,0x0000)16Read(int16_t *value)

uint16_t AdisBurst
{        
      uint8_t i;
        uint16_t sum;
        ADIS_CS_LOW();
    ADIS_SEND_BYTE(0x6800);
        for(i = 0;i < 10; i++)
        {
            value[i] = ADIS_READ_BYTE();
        }    
        ADIS_CS_HIG();
        sum = 0;
        for(i = 0;i < 9;i++)
        {
            sum += value[i]&0xFF;
            sum += (value[i] >> 8)&0xFF;
        }
        if(sum != value[9])
            return False;
        return True;
}

5.数据转换,没有做数据标志检测

            AdisData.gyro[0] = (float)data[1]/10.0f;
            AdisData.gyro[1] = (float)data[2]/10.0f;
            AdisData.gyro[2] = (float)data[3]/10.0f;
            AdisData.accl[0] = (float)data[4]*0.01225f;
            AdisData.accl[1] = (float)data[5]*0.01225f;
            AdisData.accl[2] = (float)data[6]*0.01225f;
            AdisData.temp = data[7];

6.寄存器写函数没有做,如需使用,可以自己实现,将读数据寄存器地址高字节置1

 

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为谁唱歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值