STM32L系列+ADXL345的I2C调试

发布者:hfy13567003617最新更新时间:2018-06-03 来源: eefocus关键字:STM32L系列  ADXL345  I2C调试 手机看文章 扫描二维码
随时随地手机看文章

STM32的硬件I2C调试确实要比模拟麻烦很多啊,一大堆的配置,调通F系列的,本以为直接移植到L系列会很轻松,没想到问题依然很多,现直接附上STM32L系列的I2C初始化及读写函数:

1.GPIO的初始化:

static void ADXL_LowLevel_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* 使能与 I2C1 有关的时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 


  /*!< Configure sEE_I2C pins: SDA */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Connect PXx to I2C_SCL*/
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);


/* Connect PXx to I2C_SDA*/
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);
  
}

2.I2C的初始化:

void I2C_ADXL_Init(void)
{  
I2C_InitTypeDef I2C_InitStructure;
ADXL_LowLevel_Init(); 
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = ADXL_ADRESS;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
  
  /* ADXL_I2C Peripheral Enable */
  I2C_Cmd(I2C1, ENABLE);
  /* Apply MEMS_I2C configuration after enabling it */
  I2C_Init(I2C1, &I2C_InitStructure); 
}

3.读

u8 I2C_ADXL_ByteRead(u8 ReadAddr)
{
u8 RxData;
/*wait until I2C bus is not busy*/
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
/* Send START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  /* Send ADXL address for write */
  I2C_Send7bitAddress(I2C1, ADXL_ADRESS, I2C_Direction_Transmitter);
    /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    /* Send the ADXL's Register address to write to */
  I2C_SendData(I2C1, ReadAddr);  
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
  /* Send STRAT condition a second time */  
  I2C_GenerateSTART(I2C1, ENABLE);
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  /* Send ADXL address for read */
  I2C_Send7bitAddress(I2C1, ADXL_ADRESS, I2C_Direction_Receiver);
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR) == RESET);
  /* Disable Acknowledgement */
    I2C_AcknowledgeConfig(I2C1, DISABLE);
(void)I2C1->SR2;
  
  /*!< Send STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET);
  
/* Read a byte from the ADXL Register */
RxData = I2C_ReceiveData(I2C1);
while(I2C1->CR1 & I2C_CR1_STOP);
    I2C_AcknowledgeConfig(I2C1, ENABLE);


return RxData;
}

4. 写

void I2C_ADXL_ByteWrite(u8 pBuffer, u8 WriteAddr)
{
  /*wait until I2C bus is not busy*/
  while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
    
/* Send START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  
    /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 
  
   /* Send MMA address for write */
  I2C_Send7bitAddress(I2C1, ADXL_ADRESS, I2C_Direction_Transmitter);
    
/* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
   
    /* Send the MMA's Register address to write to */    
  I2C_SendData(I2C1, WriteAddr); 
  
  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   
    /* Send the byte to be written */
  I2C_SendData(I2C1, pBuffer);
  
   /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
   
   /* Send STOP condition */
  I2C_GenerateSTOP(I2C1, ENABLE);


}


关键字:STM32L系列  ADXL345  I2C调试 引用地址:STM32L系列+ADXL345的I2C调试

上一篇:STM32中FSMC与硬件I2C冲突
下一篇:STM32 串口初始化时的BUG

推荐阅读最新更新时间:2024-03-16 16:04

利用数字示波器调试嵌入式I2C总线的方法
  I2C总线是PHLIPS公司上世纪80年代推出的一种两线式串行总线,最初为音频、视频设备所开发,如今则多在各种嵌入式系统中用于连接 微控制器 及其外围设备。   I2C总线仅需采用两根通信线(一根为串行数据线“SDA”,一根为串行时钟线“SCL”),而传输速率在高速模式下可达3.4Mbit/s,并且是多主总线。每一个挂接在I2C总线上的I2C器件均可通过唯一的地址进行访问。   在嵌入式系统开发中应用I2C总线可有效缩减元器件面积、改善抗干扰能力及增强设计的兼容性。当然,在享受其设计便利性的同时,信号的复杂性也将提高系统调试的难度。   本文阐述了在实际开发中所遇到的I2C通信问题及使用示波器分析问题和解决问题的方
[嵌入式]
I2C配置及调试流程
一、I2C配置 1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO10作为I2C_SDA,GPIO11作为I2C_SCL为例。 2.根据MSM8937 DEVICE SPECIFICATION文档,查找GPIO10与GPIO11对应的BLSP,以及检查GPIO10与GPIO11是否可以作为I2C来使用。根据文档,GPIO10对应BLSP3_1,GPIO11对应BLSP3_0。 3.根据80-nu767-1_h_linux_bam_low-speed_peripherals_configuration_and_debug_guide文件,查找I2C部分BLSP3_0与BLSP3_1对应内容,包括其物理地址、re
[单片机]
STM32L系列单片机内部EEPROM的读写
STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已。STM32L的EEPROM使用寿命设计为100000次擦写以上,容量为2K-4K,这对于一般设备的参数存储来说是非常理想的。但从EEPROM使用方式看,其不适用于被反复修改的数据存储使用,一般作为配置参数,其修改次数往往是比较少量的。 STM32L的EEPROM和FLASH是统一编址,操作共用同一个读写电路,所以在EEPROM读写的时候STM32L核对于FLASH的一切访问和操作都将暂停,只有当EEPROM的操作完成后,才继续执行后续代码,在这期间只有EEPROM的读写电路工
[单片机]
stm32---ADXL345
ADXL345是一款三轴加速度传感器,广泛用于手机、游戏手柄等设计。 ADXL 支持标准的 I2C 或 SPI 数字接口,自带 32 级 FIFO 存储,并且内 部有多种运动状态检测和灵活的中断方式等特性,常用I2C接口 检测轴 初始化步骤 1)上电 2)等待 1.1ms 3)初始化命令序列 4)结束 其中上电这个动作发生在开发板第一次上电的时候,在上电之后,等待 1.1ms 左右,就可以开始发送初始化序列了,初始化序列一结束, ADXL345 就 开始正常工作了 stm里的硬件电路 adxl345.c #include adxl345.h #include iic.h #include math.h #
[单片机]
stm32---<font color='red'>ADXL345</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved