ADXL345数字加速度计(用于倾角仪)–IIC通信
.c文件
#include "adxl345_ii2.h"
#include "main.h"
#include "function.h"
#include "uart.h"
#if defined(ADXL345_PROGRAM)
void ADXL_IIC_Delay(void)
{
uint16_t Delay= 5*20;
do
{
__NOP(); __NOP(); __NOP();
}
while (Delay --);
}
/*********************************************************
*函数名:void ADXL_IIC_Init(void)
*功能:初始化ADXL345 IIC引脚
*********************************************************/
void ADXL_IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pins :SDA */
GPIO_InitStruct.Pin = SDA_GPIO;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(SDA_GPIOX, &GPIO_InitStruct);
/*Configure GPIO pins :SCL */
GPIO_InitStruct.Pin = SCL_GPIO;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(SCL_GPIOX, &GPIO_InitStruct);
}
/*********************************************************
功能:设置SDA引脚输入
*********************************************************/
void ADXL_IIC_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pins : PA1 */
GPIO_InitStruct.Pin = SDA_GPIO;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(SDA_GPIOX, &GPIO_InitStruct);
}
/*********************************************************
功能:设置SDA引脚输出
*********************************************************/
void ADXL_IIC_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pins :PA1 */
GPIO_InitStruct.Pin = SDA_GPIO;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(SDA_GPIOX, &GPIO_InitStruct);
}
/*********************************************************
功能:产生IIC起始信号
*********************************************************/
void ADXL345_Start(void)
{
ADXL_SDA_OUT();
ADXL_IIC_SDA_H;;
ADXL_IIC_SCL_H;
ADXL_IIC_Delay();
ADXL_IIC_SDA_L;
ADXL_IIC_Delay();
ADXL_IIC_SCL_L;
}
/*********************************************************
功能:产生IIC停止信号
*********************************************************/
void ADXL345_Stop(void)
{
ADXL_SDA_OUT();
ADXL_IIC_SCL_L;
ADXL_IIC_SDA_L;
ADXL_IIC_Delay();;
ADXL_IIC_SCL_H;
ADXL_IIC_SDA_H;
ADXL_IIC_Delay();
}
/*********************************************************
功能:产生ACK应答
*********************************************************/
void ADXL345_SendACK(void)
{
ADXL_IIC_SCL_L;
ADXL_SDA_OUT();
ADXL_IIC_SDA_L;
ADXL_IIC_Delay();
ADXL_IIC_SCL_H;;
ADXL_IIC_Delay();
ADXL_IIC_SCL_L;
}
/*********************************************************
功能:不产生ACK应答
*****************************************************/
void ADXL345_SendNACK(void)
{
ADXL_IIC_SCL_L;
ADXL_SDA_OUT();
ADXL_IIC_SDA_H;
ADXL_IIC_Delay();
ADXL_IIC_SCL_H;;
ADXL_IIC_Delay();
ADXL_IIC_SCL_L;
}
/*********************************************************
功能:等待应答信号到来
返回值:1:接收应答失败
0:接收应答成功
*********************************************************/
uint8_t ADXL345_RecvACK(void)
{
uint8_t ucErrTime=0;
ADXL_SDA_IN();
ADXL_IIC_SDA_H;
ADXL_IIC_Delay();
ADXL_IIC_SCL_H;
ADXL_IIC_Delay();
while(ADXL_READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
ADXL345_Stop();
return 1;
}
}
ADXL_IIC_SCL_L;
return 0;
}
/*********************************************************
功能:IIC发送一个字节
返回值:1:有应答
0:无应答
*********************************************************/
void ADXL345_SendByte(uint8_t txd)
{
uint8_t t;
uint8_t tmp=0;
ADXL_SDA_OUT();
ADXL_IIC_SCL_L;
for (t=0; t<8; t++)
{
tmp = (txd&0x80)>>7;
if(tmp==1)
ADXL_IIC_SDA_H;
else
ADXL_IIC_SDA_L;
txd<<=1;
ADXL_IIC_SCL_H;
ADXL_IIC_Delay();
ADXL_IIC_SCL_L;
ADXL_IIC_Delay();
}
}
/*********************************************************
功能:读一个字节
返回值:读取的数据
*********************************************************/
uint8_t ADXL345_RecvByte(unsigned char ack)
{
unsigned char i,receive=0;
ADXL_SDA_IN();
ADXL_IIC_SDA_H;
for (i=0; i<8; i++)
{
ADXL_IIC_SCL_L;
ADXL_IIC_Delay();
ADXL_IIC_SCL_H;
receive <<= 1;
if(ADXL_READ_SDA)
receive++;
ADXL_IIC_Delay();
}
if(!ack)
ADXL345_SendNACK();
else
ADXL345_SendACK();
return receive;
}
#endif
adxl345.h文件
#include "main.h"
#if defined(ADXL345_PROGRAM)
#define SDA_GPIO GPIO_PIN_6
#define SCL_GPIO GPIO_PIN_7
#define SDA_GPIOX GPIOA
#define SCL_GPIOX GPIOA
#define IIC_SDA SDA_GPIOX,SDA_GPIO
#define IIC_SCL SCL_GPIOX,SCL_GPIO
#define ADXL_SDA_IN() ADXL_IIC_SDA_IN()
#define ADXL_SDA_OUT() ADXL_IIC_SDA_OUT()
#define ADXL_IIC_SCL_H HAL_GPIO_WritePin(IIC_SCL,GPIO_PIN_SET)
#define ADXL_IIC_SCL_L HAL_GPIO_WritePin(IIC_SCL,GPIO_PIN_RESET)
#define ADXL_IIC_SDA_H HAL_GPIO_WritePin(IIC_SDA,GPIO_PIN_SET)
#define ADXL_IIC_SDA_L HAL_GPIO_WritePin(IIC_SDA,GPIO_PIN_RESET)
#define ADXL_READ_SDA HAL_GPIO_ReadPin(SDA_GPIOX,SDA_GPIO)
void ADXL_IIC_Delay(void);
void ADXL_IIC_Init(void);
void ADXL345_Start(void);
void ADXL345_Stop(void);
void ADXL345_SendACK(void);
void ADXL345_SendNACK(void);
uint8_t ADXL345_RecvACK(void);
void ADXL345_SendByte(uint8_t txd);
uint8_t ADXL345_RecvByte(unsigned char ack);
#endif
#endif