完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
FW版本是1.12;
使用IC是STM32L0F4U; CUBEMX配置,使用LL库。 前提:因为从机的IIC是非标准协议,第一个字节不是控制R/W, 不能用HAL库解决,想使用LL库或者寄存器方式来实现,从设备没有问题,使用模拟方式能够实现。 问题:I2C_TXDR这个寄存器的数据,发送不出去。 完全采用LL库函数,其初始化函数如下,频率是400K 、
其中I2C_write()的函数内容是
LL_I2C_TransmitData8() 这个库函数完全发送不出来数据,示波器抓取不到波形,TXE位一直是reset。如果使用这一条I2Cx->CR2 |= I2C_CR2_START; /* 启动 */,这能发出波形,但是数据类容并非LL_I2C_TransmitData8中的数据,而是配置的从机地址。 如果调用LL_I2C_HandleTransfer() 这个函数,则能发出来波形,但是这个函数会自动调整R/W位,所以不能在第一个字节使用。 使用这个方法未能实现我需要的功能。 方法二:利用手册中的示例代码,完全寄存器操作,配置好IIC和GPIIO,配置如下:
调用如下:
发的数据也不是0x48,而是从机地址0x5A<<1 . 实在没招了,求大佬指点 |
|
相关推荐
2个回答
|
|
第一个字节不是标准地址和控制读写位,那么可以按照从机的需求把需要的值配给相关的地址寄存器I2C-CR2 ,使得主机发送的地址就是从机需要的值。这个外设是按照标准I2C协议设计的,所以一使能就会发出START+ADDRESS。试试看能不能变通一下。从手册上看,省略不了地址值的发送
|
|
|
|
首先,确保你的I2C总线上没有其他设备正在使用,并且确认从设备的地址正确。然后,你可以尝试执行以下步骤来解决问题: 1. 确保I2C时钟已经正确配置。你可以使用`LL_RCC_GetSystemClocksFreq(&rcc_clocks)`函数来获取系统时钟频率并进行检查。 2. 初始化I2C控制器。 ```c void MX_I2C1_Init(void) { // 使能I2C1的时钟 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); // 配置I2C1的时钟源和时钟速度 LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_SYSCLK); LL_I2C_SetClockSpeedMode(I2C1, LL_I2C_CLOCK_SPEED_STANDARD, SystemCoreClock, 100000, 0); // 配置I2C模式和主/从模式 LL_I2C_SetMode(I2C1, LL_I2C_MODE_I2C); LL_I2C_SetMasterMode(I2C1, LL_I2C_MASTER_MODE_SINGLE); // 使能I2C总线 LL_I2C_Enable(I2C1); } ``` 3. 配置I2C传输。 ```c void I2C1_Transmit(uint8_t address, uint8_t* data, uint16_t size) { // 等待总线空闲 while (!LL_I2C_IsActiveFlag_BUSY(I2C1)) ; // 生成START信号 LL_I2C_GenerateStartCondition(I2C1); while (!LL_I2C_IsActiveFlag_SB(I2C1)) ; // 发送从设备地址和读写位 LL_I2C_TransmitData8(I2C1, (address << 1) | LL_I2C_DIRECTION_WRITE); while (!LL_I2C_IsActiveFlag_ADDR(I2C1)) ; LL_I2C_ClearFlag_ADDR(I2C1); // 发送数据 for (uint16_t i = 0; i < size; i++) { LL_I2C_TransmitData8(I2C1, data[i]); while (!LL_I2C_IsActiveFlag_TXE(I2C1)) ; } // 生成STOP信号 LL_I2C_GenerateStopCondition(I2C1); while (!LL_I2C_IsActiveFlag_STOP(I2C1)) ; } ``` 你可以调用`I2C1_Transmit()`函数来发送数据。确保地址数据和待发送数据的格式是正确的。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1781 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1085 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
732浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
557浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 08:01 , Processed in 0.757516 second(s), Total 50, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号