STM32CubeMx之硬件IIC调试基本方法

发布者:太白山人最新更新时间:2018-06-02 来源: eefocus关键字:STM32CubeMx  硬件IIC  调试 手机看文章 扫描二维码
随时随地手机看文章

如题,最近在调试STM32的硬件IIC,从中发现了很多问题,经过网上查找资料总结和实际测试,总结出如下步骤来检测硬件IIC。 

测试环境如下: 

STM32F407开发板; 

STM32Cube固件库F4 1.6.0 

IIC设备 AT24C02 

IIC配置如下:


void MX_I2C1_Init(void)

{


  hi2c1.Instance = I2C1;

  hi2c1.Init.ClockSpeed = 100000;

  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;

  hi2c1.Init.OwnAddress1 = 0;

  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

  hi2c1.Init.OwnAddress2 = 0;

  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

  if (HAL_I2C_Init(&hi2c1) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


}


1.检查STM32Cube时钟项配置是否正确(主要看所接入的时钟源是否与实际时钟源一致) 

2.检查在完成IIC初始化后,SDA、SCL引脚是否为高电平,不是的话,要采用软件的方式实现,在IIC初始化代码增加如下步骤:


void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

{

  GPIO_InitTypeDef GPIO_InitStruct;

  if(i2cHandle->Instance==I2C1)

  {

  /* USER CODE BEGIN I2C1_MspInit 0 */


  /* USER CODE END I2C1_MspInit 0 */


    /**I2C1 GPIO Configuration    

    PB8     ------> I2C1_SCL

    PB9     ------> I2C1_SDA 

    */

    //增加代码部分Start

    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);

    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);


    hi2c1.Instance->CR1=I2C_CR1_SWRST;

    hi2c1.Instance->CR1=0;

    //增加代码部分End

    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


......

}


若此方式还是无法解决,就可能是硬件问题了;


3.验证硬件IIC单字节读取是否成功,测试代码如下:


#define ADDR_24LCxx_Write 0xA0

#define ADDR_24LCxx_Read 0xA1


uint8_t val=0;

HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, 0, I2C_MEMADD_SIZE_8BIT,0x5A,1,0xff);

HAL_Delay(5);

HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,&val,1,0xff);


4..验证硬件IIC多字节字节读取是否成功,测试代码如下:


#define BufferSize 0x100

uint8_t WriteBuffer[BufferSize],ReadBuffer[BufferSize];

uint16_t i;



printf("\r\n***************I2C Example*******************************\r\n");

printf("WriteBuffer\r\n");

for(i=0; i<256; i++)

{

WriteBuffer[i]=256-i;    /* WriteBuffer init */

printf("0x%02X  ",WriteBuffer[i]);

}


/* wrinte date to EEPROM */

for(i=0;i

{

    HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, i, I2C_MEMADD_SIZE_8BIT,&WriteBuffer[i],1,0xff);//使用I2C块读,出错。因此采用此种方式,逐个单字节写入

  HAL_Delay(5);//此处延时必加,与AT24C02写时序有关

}

printf("\r\n EEPROM 24C02 Write Test OK \r\n");


HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,ReadBuffer,BufferSize,0xff);


for(i=0; i<256; i++)

printf("0x%02X  ",ReadBuffer[i]);


if(memcmp(WriteBuffer,ReadBuffer,BufferSize) == 0 ) /* check date */

printf("\r\n EEPROM 24C02 Read Test OK\r\n");

else

printf("\r\n EEPROM 24C02 Read Test False\r\n");

AT24C02写时序如下: 
这里写图片描述
其中twr为两次写入的时间间隔,其间隔最大为5ms;

至此,硬件IIC的使用完成;不管硬件IIC采用何种形式(DMA,IT),都要确保两次写入的间隔大于5ms;


关键字:STM32CubeMx  硬件IIC  调试 引用地址:STM32CubeMx之硬件IIC调试基本方法

上一篇:关于STM32的HAL库硬件I2C简单调试
下一篇:stm32 hal i2c 库读写sd3088时钟

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

STM32L431之MDK-ARM单步调试错乱
芯片默认使用MSI,频率只有4M,现在需要改成最大时钟80M。一个简单的程序如下: void SystemClock_Init(void){ /* enable HSE */ RCC- CR |= 0x00010000U; while (0 == (RCC- CR & 0x00020000U)); /* configure PLL */ RCC- PLLCFGR = (3 0) | (3 4) | (80 8) | (1 16) | (0 17) | (1 20) | (1 21) | (1 24) | (0 25); /* Fvco = (8M) * (80/4) = 160M,
[单片机]
STM32L431之MDK-ARM单步<font color='red'>调试</font>错乱
Imagination全新GPU调试功能可简化应用与游戏开发
英国伦敦 ─ 2018年3月20日 ─ Imagination Technologies 宣布推出具备完整功能的集成开发环境(IDE)PVRStudio,它可简化嵌入式与移动平台上的应用与游戏开发。利用 PVRStudio 2018 Release 1,开发人员便拥有了功能强大的PowerVR GPU调试工具,能在调试GPU上运行程序的同时,对在CPU硬件上运行的程序同步进行调试。 对于那些为带有 PowerVR GPU的产品创建应用与游戏的开发人员来说,通过直接对接运行在GPU统一着色内核(USC)上的执行程序,PVRStudio可提供粒度更精细的调试能力;因为大部分重要的3D绘图与运算应用程序都运行在USC上。这能使开发人
[半导体设计/制造]
采用JLink+ADS1.2调试uboot的方法
刚开始想通过Nor Flash中的supervivi+DNW的“Download & Run 功能”将uboot.bin下到SDRAM进行调试,但是由于笔记本已经被装成ubuntu + Virtualbox(Windows XP),将supervivi阶段的USB下载设备分配进Virtualbox(Windows XP)后提示“不能分配 USB设备 System MCU SEC S3C2410X Test B/D 到虚拟电脑 Windows XP Workstation.Failed to create a proxy device for the USB device. (Error: VERR_READ_ERROR).”,而
[单片机]
采用JLink+ADS1.2<font color='red'>调试</font>uboot的方法
STM32 J-LINK SW 调试常见问题
STM32 支持 SW 调试,只需用占用两个端口 SWDIO/SWCLK 及 VCC/GND,最多四条线就可以调试。 SWDIO/SWCLK 不需要上拉或下拉电阻。 调试时常见 No Cortex-M SW Device Found 问题,可以尝试以下方法: 1、可能软件设置了JTAG_SW_DISABLE,请将BOOT0接到VCC然后复位 2、VCC电压过低,可以尝试降低 JLINK/JTRACE Cortex-M Driver Setup 中的 Max Clock,找到合适的时钟频率 3、提示找不到J-LINK,检查是否板子是否没有上电
[单片机]
STM8S103调试PWM的踩坑过程
最近有个项目要用STM8S103F3P6的PWM去调光。硬件是用Pin1来输出PWM信号。因为之前没用ST的单片机,所以一切都从零开始,慢慢摸索。通过查资料得知这个脚就是time2的channel 1,接着就直接copy例程download到芯片里去,奇怪就是没有PWM信号出来,接下来就是一通百度和Google,调试了两天问题还没解决。这样也没办法啊,只有硬着头皮仔细一点找原因,终于被我找到问题出在哪里:原来在stm8s.h定义time2的结构体里面有个宏没打开 如果这个宏不开的话会导致time2寄存器的地址不对,寄存器地址不对了PWM的信号就出不来了。因为第一次用这个MCU,很多东西都不熟,怎么去定义STM8S103这个宏我
[单片机]
STM8S103<font color='red'>调试</font>PWM的踩坑过程
泡水式密封性检漏仪‍的调试方法
泡水式密封性检漏仪‍是采用泡水加压的方法来确定泄露部位的测试仪器,可以用于LED灯具、通讯产品、汽车以及电子元件等电子类产品的泄漏处检测,以及一些包装袋、瓶、罐以及盒等进行密封检漏测试。在使用前要怎么对泡水式密封性检漏仪‍如何做调试呢? 先将压力稳定的压缩气源(空压机)接出的气管接头插到密封性检漏仪‍的进气口上,拨动升降开关至升那一侧,向检测缸内注入一定量的清水,高度要到托板板面下面齐平就可以了;放入产品就可以盖好密封测试通的密封盖,将充排气开关拨到充气侧,此时就可以调整密封性检漏仪‍的控制调节旋钮;调节至所需的稳定压力之后,压力数值观察好之后,拨动升降开关至降的那一侧,泡水机托板下沉到底后,就可以将密封性检漏仪‍充排气开关拨
[测试测量]
STM32调试SP3485技术总结
1、本文使用的STM32芯片是STM32F103RB,使用的资源是片内的USART1。 2、下面是我的电路连接图: 注:电路可以稍做修改更好,在B和A分别接下拉电阻到地和上拉电阻到5v,阻值选择为10K即可,这是为了在没有进行数据传输时保证两条数据线的状态为确定值。 做一下简单的说明: (1)PA8是sp3485的发送/接收使能端,sp3485只能支持半双工的通信,所以这个引脚就是来控制这个芯片到底是收数据还是发数据的。 (2)在有些电路连接中,sp3485的A和B端会一个被连接一个上拉电阻到3.3V,另一个会连接一个下拉电阻到GND,这样做的目的是当本sp3485不参与通信时不会影响网络的稳定性。 3、本次调试方式 PC
[单片机]
STM32<font color='red'>调试</font>SP3485技术总结
vsocde STM8 调试器使用
STM8-Debug 是一个 Vscode 上的 STM8 调试器,通过使用 GDB 连接 STLink 设备完成对 STM8 的调试 1. vscode:launch.json 配置 2. F5 启动调试 注意事项: launch.json 的 executable 字段必须是含有 gdb 调试信息的可执行文件路径,IAR 或者 COSMIC 生成的都可以 此版本 GDB 不支持任何中文路径,因此所有的路径中不能含有中文字符,包括源码文件的路径
[单片机]
vsocde STM8 <font color='red'>调试</font>器使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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