1.CUBEMX生成代码后I2C总线初始化一直出现 I2C_FLAG_BUSE
1.1 环境:
1.2 硬件I2C配置为默认,管脚如下
1.3 时钟等其他 配置完成后生成工程
1.4 添加代码
在i2c.c文件中的的void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)函数中添加如下代码
__I2C2_FORCE_RESET();
__I2C2_RELEASE_RESET();
实际如下图
这里采用读取板载的MPU6050的设备地址来确认硬件I2C是否工作正常。 主函数里main.c添加程序如下:
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t device_id_reg = 0x75; //存放MPU6050设备地址的寄存器
uint8_t device_id = 0x68; //MPU6050设备地址,0x75寄存器读取的地址与此相同
uint8_t device_id_reg_ret; //用来存放读取的设备地址
/* USER CODE END PV */
在while循环里添加读取设备地址代码,效果如下:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint32_t cnt = 0;
HAL_Delay(10);
if(cnt%10==0)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin | LED1_Pin);
}
if(cnt%20==0)
{
HAL_I2C_Mem_Read(&hi2c1,device_id<<1 , 0X75, I2C_MEMADD_SIZE_8BIT,&device_id_reg_ret,1, 1000);//读MPU6050的ID
printf("MPU6050device_id %xrn",device_id_reg_ret);
}
cnt++;
}
编译下载后在串口可以看到打印信息:
与给定的设备地址相同,说明代码配置的硬件i2c可用
关键字:stm32 硬件I2C 总线初始化
引用地址:
STM32硬件I2C问题
推荐阅读最新更新时间:2024-11-12 16:51
stm32 gpio的相关问题
gpio 设置流程: 设置gpio的时钟 设置gpio 的pin角 设置gpio pin的功能(速度 输入输出模式 reset) 设置gpio data void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_O
[单片机]
回炉重造STM32 CUBEMX之串口通讯问题四
串口通讯+PWM波:STM32F103C8T6通过USART1输入相应的指令控制的TIM3四个通道生成四个占空比不同的频率为50HzPWM波来控制云台。 之前用FT232直连单片机,一切正常返回的指令无乱码正常。 接上数传图传出现问题: 1、连续给出高电平时间持续1.5ms的指令,电机本该静止却会往一个方向慢慢漂移。怀疑每次在发出指令单片机相应指令的过程中会导致PWM波占空比变化。 2、接上数传后返回的指令中含有很多乱码。设备有时会莫名重启或者关闭。怀疑是发送的指令出现了偏差触发了开关机的指令。 3、设备返回的图像黑屏 解决方法: 1、对于重复发出的指令,设置相应的重复处理程序。若指令相同或者相同指令持续3次则跳
[单片机]
STM32之串口的使用
1、为什么要用串口? 自上一篇写的时间是1月20号,今6月7号了,半年没更新了。 这半年发生了什么?过完年就去找公司实习,在那里自我感觉进步很大。其实在公司大多都是自学,师傅基本不会给你说什么。但这并不能说明你的师傅对你不好,带我的那个师傅只比我高一届,但他的水平比我高的好多届。他也是自学,也没人告诉他该怎么做,因为老板也不太懂。所以自学能力很重要,当然有人带你的话,这样会更好。 不说这些了,串口在调试的时候作用非常大。也学我们在学51的时候,只是将程序下载到开发板,看看是否能运行起来,通过数码管将结果显示出来,从而就知道程序设计的正确性。以前我也是这样做的,没什么不好。 在公司实习的时候,他们调试都是使用串口打印输出
[单片机]
STM32 外部(IO)中断EXTI的应用
a) 目的:跟串口输入类似,不使用中断进行的IO输入效率也很低,而且可以通过EXTI插入按钮事件,本节联系EXTI中断。 b) 初始化函数定义: void EXTI_Configuration(void); //定义IO中断初始化函数 c) 初始化函数调用: EXTI_Configuration();//IO中断初始化函数调用简单应用: d) 初始化函数: void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义 EXTI_Cle
[单片机]
如何用STM32让相对编码器说话?
▍编码器的由来和原理 若要对伺服系统中的电机进行高精度控制,需要准确的转子角度位置,这时候自然会想到,如果能张江转子每一圈进行细分,这样每次转多少角度便能精确知道。在这样的背景下,相对编码器就诞生了。 在网上找到下文这个图,很形象的表征了相对编码器的原理。 如图所示,在码盘上平均开出很多个等间距的槽,一段是LED灯发出信号,另一端是接收器接收信号。如果信号能穿过码盘,则接收信号为高电平,反之则为低电平。这样当转子转起来以后,就不断的处高低电平。这就是编码器基本原理。 可以看到这里有三个信号,A/B/Z,这时候就要想为什么要3个信号呢?如果仅仅对一圈做细分,命名一个信号就可以了。这就涉及到下面两个问题。 (1)如果是1个信号
[单片机]
STM32开发笔记34:USB CDC驱动程序的详细移植过程
单片机型号:STM32F401 本文详细介绍USB CDC驱动程序的移植过程。 1、按照STM32F4 开发笔记8:解决USB CDC “该设备无法启动”问题介绍的过程生成驱动程序后,找到如下图所示的文件加入到自己的项目工程中。 2、打开usbd_cdc_if.c文件,可以看到其中有,如下4个函数,其中Init、DeInit和Control函数都不需要改变,关键是Receive函数。 static int8_t CDC_Init_FS(void); static int8_t CDC_DeInit_FS(void); static int8_t CDC_Control_FS(uint8_t cm
[单片机]
STM32单片机FSMC模块的应用
一、基本概念 1.与非总线复用的16位SRAM接口 FSMC配置 SRAM存储器和NOR闪存存储器共用相同的FSMC存储块,所用的协议依不同的存储器类型而有所不同。 控制SRAM存储器,FSMC应该具有下述功能: 使用或禁止地址/数据总线的复用功能。 选择所用的存储器类型:NOR闪存、SRAM或PSRAM。 定义外部存储器的数据总线宽度:8或16位。 使用或关闭扩展模式:扩展模式用于访问那些具有不同读写操作时序的存储器。 正如配置NOR闪存存储器一样,用户必须按照SRAM存储器的数据手册给出的时序数据,计算和设置下列参数: ADDSET:地址建立时间 ADDHOLD:地址保持时间 DATAST:数据建立时间 二、例程 1.
[单片机]
Stm32串口发送字节数据
说明:每发送一次数据,LED等闪烁一下 /* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_usart.h #include system_stm32f10x.h #include stdio.h #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) void RCC_Configuratio
[单片机]