/*
*********************************************************************************************************
*
* 文件名称 : bsp_ADXL355.c
* 版 本 : V1.0
* 说 明 : ACC-ADXL355 模块驱动文件
* 作 者 : Mr. Albert Chen
*
*********************************************************************************************************
*/
#include "bsp_ADXL355.h"
u8 res=0;
/*
*********************************************************************************************************
* 函 数 名: ADXL355_SPI2_Init
* 功能说明: 配置ADXL355的硬件SPI2的GPIO端口和硬件SPI2的相关设置,并将SPI2初始化
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void ADXL355_SPI2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能SPI2时钟
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13复用为 SPI2
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2); //PB14复用为 SPI2
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); //PB15复用为 SPI2
//GPIOB_12,13,14,15初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12-SPI2_NCS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //PB13-SPI2_SCLK
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //PB14-SPI2_MISO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PB15-SPI2_MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
//这里对SPI口初始化
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //使能复位SPI2
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停止复位SPI2
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双全工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主机
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位数据传输模式
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //空闲时低电平 |CPOL=0|
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第一个时钟开始采样 |CPHA=0|
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制NSS
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //sclk<10MHz 32分频 84M/32=2.6M
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC校验
SPI_Init(SPI2, &SPI_InitStructure); //初始化SPI2
SPI_Cmd(SPI2, ENABLE); //使能SPI2
CS_ADXL355_HIGH; //将SPI片选端口拉高,初始化SPI2后先不使能它
}
/*
*********************************************************************************************************
* 函 数 名: ADXL355_SPI_Write
* 功能说明: 通过STM32的硬件SPI向ADXL355中写入数据、命令、寄存器地址
* 形 参: address - ACC register address
Data - value to be written in 1 register write
Data2 - 2nd value to be written in 2 register write
enWriteData - write mode
* 返 回 值: 无
* 备 注:
*********************************************************************************************************
*/
void ADXL355_SPI_Write(uint8_t address, uint8_t Data, uint8_t Data2, enWriteData enMode)
{
uint8_t writeAddress;
writeAddress = ((address <<1)|ADXL355_WRITE);
if(enMode == SPI_WRITE_ONE_REG)
{
CS_ADXL355_LOW;
/* Send register address */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) != SET);
SPI_I2S_SendData(SPI2,writeAddress);
/** Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
SPI_I2S_ReceiveData(SPI2);
/* Send value to be written */
SPI_I2S_SendData(SPI2,Data);
/** Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
SPI_I2S_ReceiveData(SPI2);
Delay_us(2);
CS_ADXL355_HIGH;
}
if(enMode == SPI_WRITE_TWO_REG)
{
CS_ADXL355_LOW;
/* Send register address */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) != SET);
SPI_I2S_SendData(SPI2,writeAddress);
/** Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
SPI_I2S_ReceiveData(SPI2);
/* Send 1st value to be written */
SPI_I2S_SendData(SPI2,Data);
/** Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
SPI_I2S_ReceiveData(SPI2);
/* Send 2nd value to be written */
SPI_I2S_SendData(SPI2,Data2);
/** Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
SPI_I2S_ReceiveData(SPI2);
Delay_us(2);
CS_ADXL355_HIGH;
}
}
/*
*********************************************************************************************************
* 函 数 名: ADXL355_SPI_Read
* 功能说明: 通过STM32的硬件SPI从ADXL355中读取数据一个地址或两个地址的数据
* 形 参: address - register address
enRegs - register number
* 返 回 值: 读取的结果
* 备 注:
*********************************************************************************************************
*/
uint32_t ADXL355_SPI_Read(uint8_t address, enRegsNum enRegs)
{
uint32_t Result = 0;
uint32_t valueL = 0;
uint32_t valueM = 0;
uint32_t valueH = 0;
uint8_t writeAddress;
writeAddress = ((address <<1)|ADXL355_READ);
CS_ADXL355_LOW;
if(enRegs == SPI_READ_ONE_REG)
{
/* Send register address */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) != SET);
SPI_I2S_SendData(SPI2,writeAddress);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
SPI_I2S_ReceiveData(SPI2);
/* 发送伪字节去得到寄存器收到的数据 */
SPI_I2S_SendData(SPI2,0xAA);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
valueL = SPI_I2S_ReceiveData(SPI2); /* One dummy read */
Result = valueL; /* Set read result*/
}
if(enRegs == SPI_READ_TWO_REG) /* Only used for Temp & X,Y,Z offset and threshold registers*/
{
/* Send register address */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) != SET);
SPI_I2S_SendData(SPI2,writeAddress);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
SPI_I2S_ReceiveData(SPI2);
/* 发送伪字节去得到寄存器收到的数据 */
SPI_I2S_SendData(SPI2,0xAA);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
valueL = SPI_I2S_ReceiveData(SPI2); /* One dummy read */
/* 发送伪字节去得到寄存器收到的数据 */
SPI_I2S_SendData(SPI2,0xAA);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
valueH = SPI_I2S_ReceiveData(SPI2); /* One dummy read */
Result = ((valueH << 8) | valueL); /* Set read result*/
}
if(enRegs == SPI_READ_THREE_REG) /* Only used for X,Y,Z axis data registers*/
{
/* Send register address */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) != SET);
SPI_I2S_SendData(SPI2,writeAddress);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
SPI_I2S_ReceiveData(SPI2);
/* 发送伪字节去得到寄存器收到的数据 */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) != SET);
SPI_I2S_SendData(SPI2,0xAA);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
valueH = SPI_I2S_ReceiveData(SPI2); /* One dummy read */
/* 发送伪字节去得到寄存器收到的数据 */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) != SET);
SPI_I2S_SendData(SPI2,0xAA);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
valueM = SPI_I2S_ReceiveData(SPI2); /* One dummy read */
/* 发送伪字节去得到寄存器收到的数据 */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) != SET);
SPI_I2S_SendData(SPI2,0xAA);
/* Wait until received */
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) != SET);
valueL = SPI_I2S_ReceiveData(SPI2); /* One dummy read */
Result = ((valueH << 16) | (valueM << 8) | valueL); /* Set read result*/
}
CS_ADXL355_HIGH;
return Result;
}
/*
*********************************************************************************************************
* 函 数 名: ADXL355_Init
* 功能说明: 配置ADXL355的寄存器,将加速度计初始化
* 形 参: 无
* 返 回 值: 无
* 备 注: 各寄存器详见头文件
*********************************************************************************************************
*/
void ADXL355_Init(void)
{
// ADXL355_SPI_Write(RANGE, 0x82, 0x00, SPI_WRITE_ONE_REG); /* Set sensor range 4G */
// Delay_ms(20);
// ADXL355_SPI_Write(FILTER,0x04, 0x00, SPI_WRITE_ONE_REG); /* ODR 250Hz,LPF 62.5Hz*/
// Delay_ms(20);
//
//这里按照金亮师兄的进行修改
ADXL355_SPI_Write(RESET, 0x52,0x00,SPI_WRITE_ONE_REG);
Delay_ms(20);
res=ADXL355_SPI_Read(PARTID,SPI_READ_ONE_REG);
if(res==0xED){
ADXL355_SPI_Write(RANGE, 0x82, 0x00, SPI_WRITE_ONE_REG); /* Set sensor range 4G */
Delay_ms(20);
ADXL355_SPI_Write(FILTER,0x04, 0x00, SPI_WRITE_ONE_REG); /* ODR 250Hz,LPF 62.5Hz*/
Delay_ms(20);
}
// uint32_t volatile ui32test ,ui32test2 ,ui32test3 ,ui32test4;
// ui32test = ADXL355_SPI_Read(DEVID_AD, SPI_READ_ONE_REG); /* Read the ID register */
// ui32test2 = ADXL355_SPI_Read(DEVID_MST, SPI_READ_ONE_REG); /* Read the ID register */
// ui32test3 = ADXL355_SPI_Read(PARTID, SPI_READ_ONE_REG); /* Read the ID register */
// ui32test4 = ADXL355_SPI_Read(RANGE, SPI_READ_ONE_REG); /* Read the ID register */
}
/*
*********************************************************************************************************
* 函 数 名: ADXL355_Start_Sensor
* 功能说明: 开启ADXL355测量模式
* 形 参: 无
* 返 回 值: 无
* 备 注:
*********************************************************************************************************
*/
void ADXL355_Start_Sensor(void)
{
uint8_t temp;
temp = (uint8_t)ADXL355_SPI_Read(POWER_CTL, SPI_READ_ONE_REG); /* Read POWER_CTL register, before modifying it */
temp = temp & 0xFE; /* Set measurement bit in POWER_CTL register */
ADXL355_SPI_Write(POWER_CTL, 0x00, 0x00, SPI_WRITE_ONE_REG); /* Write the new value to POWER_CTL register */
}
/*
*********************************************************************************************************
* 函 数 名: ADIS16445_AccRead
* 功能说明: Reads the accelerometer data.
* 形 参: *AccData_original
* 返 回 值: 无
* 备 注: 1.因为spi读取存在一个周期的时间差,因此发送XACCL_OUT地址后下一个周期读的数才为X轴数据
* 以此类推
* 2.缓存【1】original_data_buf IMU输出的原始数据
*********************************************************************************************************
*/
int32_t ADXL355_Acceleration_Data_Conversion (uint32_t SensorData)
{
int32_t volatile Conversion = 0;
SensorData = (SensorData >> 4);
SensorData = (SensorData & 0x000FFFFF);
if((SensorData & 0x00080000) == 0x00080000){
Conversion = (SensorData | 0xFFF00000);
}
else{
Conversion = SensorData;
}
return Conversion;
}
void ADXL355_Data_Scan(int32_t *AccData_original_32)
{
uint32_t SensorX,SensorY,SensorZ;
//SensorX = ADXL355_SPI_Read(XDATA3, SPI_READ_THREE_REG);
SensorX = ADXL355_SPI_Read(XDATA3, SPI_READ_THREE_REG);
SensorY = ADXL355_SPI_Read(YDATA3, SPI_READ_THREE_REG);
SensorZ = ADXL355_SPI_Read(ZDATA3, SPI_READ_THREE_REG);
AccData_original_32[0] = ADXL355_Acceleration_Data_Conversion(SensorY);
AccData_original_32[1] = -ADXL355_Acceleration_Data_Conversion(SensorX);
AccData_original_32[2] = ADXL355_Acceleration_Data_Conversion(SensorZ);
}
全部资料51hei下载地址:
BSP_ADXL355.rar
(3.85 KB, 下载次数: 95)
|