|
/*
*********************************************************************************************************
*
* 文件名稱 : bsp_ADXL355.c
* 版 本 : V1.0
* 說 明 : ACC-ADXL355 模塊驅(qū)動(dòng)文件
* 作 者 : Mr. Albert Chen
*
*********************************************************************************************************
*/
#include "bsp_ADXL355.h"
u8 res=0;
/*
*********************************************************************************************************
* 函 數(shù) 名: ADXL355_SPI2_Init
* 功能說明: 配置ADXL355的硬件SPI2的GPIO端口和硬件SPI2的相關(guān)設(shè)置,并將SPI2初始化
* 形 參: 無
* 返 回 值: 無
*********************************************************************************************************
*/
void ADXL355_SPI2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能GPIOB時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能SPI2時(shí)鐘
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13復(fù)用為 SPI2
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2); //PB14復(fù)用為 SPI2
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2); //PB15復(fù)用為 SPI2
//GPIOB_12,13,14,15初始化設(shè)置
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; //復(fù)用功能
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; //復(fù)用功能
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; //復(fù)用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
//這里對(duì)SPI口初始化
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //使能復(fù)位SPI2
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停止復(fù)位SPI2
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //雙全工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主機(jī)
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位數(shù)據(jù)傳輸模式
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //空閑時(shí)低電平 |CPOL=0|
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第一個(gè)時(shí)鐘開始采樣 |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校驗(yàn)
SPI_Init(SPI2, &SPI_InitStructure); //初始化SPI2
SPI_Cmd(SPI2, ENABLE); //使能SPI2
CS_ADXL355_HIGH; //將SPI片選端口拉高,初始化SPI2后先不使能它
}
/*
*********************************************************************************************************
* 函 數(shù) 名: ADXL355_SPI_Write
* 功能說明: 通過STM32的硬件SPI向ADXL355中寫入數(shù)據(jù)、命令、寄存器地址
* 形 參: 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;
}
}
/*
*********************************************************************************************************
* 函 數(shù) 名: ADXL355_SPI_Read
* 功能說明: 通過STM32的硬件SPI從ADXL355中讀取數(shù)據(jù)一個(gè)地址或兩個(gè)地址的數(shù)據(jù)
* 形 參: address - register address
enRegs - register number
* 返 回 值: 讀取的結(jié)果
* 備 注:
*********************************************************************************************************
*/
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);
/* 發(fā)送偽字節(jié)去得到寄存器收到的數(shù)據(jù) */
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);
/* 發(fā)送偽字節(jié)去得到寄存器收到的數(shù)據(jù) */
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 */
/* 發(fā)送偽字節(jié)去得到寄存器收到的數(shù)據(jù) */
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);
/* 發(fā)送偽字節(jié)去得到寄存器收到的數(shù)據(jù) */
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 */
/* 發(fā)送偽字節(jié)去得到寄存器收到的數(shù)據(jù) */
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 */
/* 發(fā)送偽字節(jié)去得到寄存器收到的數(shù)據(jù) */
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;
}
/*
*********************************************************************************************************
* 函 數(shù) 名: ADXL355_Init
* 功能說明: 配置ADXL355的寄存器,將加速度計(jì)初始化
* 形 參: 無
* 返 回 值: 無
* 備 注: 各寄存器詳見頭文件
*********************************************************************************************************
*/
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);
//
//這里按照金亮師兄的進(jìn)行修改
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 */
}
/*
*********************************************************************************************************
* 函 數(shù) 名: 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 */
}
/*
*********************************************************************************************************
* 函 數(shù) 名: ADIS16445_AccRead
* 功能說明: Reads the accelerometer data.
* 形 參: *AccData_original
* 返 回 值: 無
* 備 注: 1.因?yàn)閟pi讀取存在一個(gè)周期的時(shí)間差,因此發(fā)送XACCL_OUT地址后下一個(gè)周期讀的數(shù)才為X軸數(shù)據(jù)
* 以此類推
* 2.緩存【1】original_data_buf IMU輸出的原始數(shù)據(jù)
*********************************************************************************************************
*/
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, 下載次數(shù): 95)
2020-11-24 10:04 上傳
點(diǎn)擊文件名下載附件
ADXL355 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|