最近公司产品需要使用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