ADXL345数字加速度计(用于倾角仪)--IIC通信

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


  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,ADXL345的初始化步骤如下: ```c // 定义ADXL345的地址 #define ADXL345_ADDRESS 0x53 // 定义ADXL345的寄存器地址 #define DEVID 0x00 #define THRESH_TAP 0x1D #define OFSX 0x1E #define OFSY 0x1F #define OFSZ 0x20 #define DUR 0x21 #define LATENT 0x22 #define WINDOW 0x23 #define THRESH_ACT 0x24 #define THRESH_INACT 0x25 #define TIME_INACT 0x26 #define ACT_INACT_CTL 0x27 #define THRESH_FF 0x28 #define TIME_FF 0x29 #define TAP_AXES 0x2A #define ACT_TAP_STATUS 0x2B #define BW_RATE 0x2C #define POWER_CTL 0x2D #define INT_ENABLE 0x2E #define INT_MAP 0x2F #define INT_SOURCE 0x30 #define DATA_FORMAT 0x31 #define DATAX0 0x32 #define DATAX1 0x33 #define DATAY0 0x34 #define DATAY1 0x35 #define DATAZ0 0x36 #define DATAZ1 0x37 #define FIFO_CTL 0x38 #define FIFO_STATUS 0x39 // 初始化ADXL345 void adxl345_init(void) { // 等待1.1ms delay_ms(2); // 初始化命令序列 i2c_start(); i2c_send_byte(ADXL345_ADDRESS << 1); i2c_send_byte(DATA_FORMAT); i2c_send_byte(0x0B); i2c_stop(); delay_ms(2); i2c_start(); i2c_send_byte(ADXL345_ADDRESS << 1); i2c_send_byte(BW_RATE); i2c_send_byte(0x0A); i2c_stop(); delay_ms(2); i2c_start(); i2c_send_byte(ADXL345_ADDRESS << 1); i2c_send_byte(POWER_CTL); i2c_send_byte(0x08); i2c_stop(); } ``` 其中,ADXL345_ADDRESS为ADXL345的地址,DEVID为ADXL345的寄存器地址,adxl345_init()函数为初始化函数,包括等待1.1ms和初始化命令序列。在初始化命令序列中,首先设置数据格式为+-16g,然后设置输出数据速率为100Hz,最后将ADXL345设置为测量模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值