
STM8的I2C在写地址的时候进入到assert_failed
发布日期:2021-05-07 04:21:07
浏览次数:22
分类:精选文章
本文共 1205 字,大约阅读时间需要 4 分钟。
近期使用stm8的库函数写功能,使用I2C时候遇到在调用 void I2C_Send7bitAddress(uint8_t Address, I2C_Direction_TypeDef Direction)的时候,会卡死的问题
通过调试发现在调用写地址函数后会进入到main.c的这个函数中
void assert_failed(u8* file, u32 line){ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ // printf("Wrong parameters value: file %s on line %d\r\n", file, line); /* Infinite loop */ while (1) {// return; }}
后来发现写地址函数会先检测输入参数是否正确如果不正确就会进入错误循环
贴上这个官方I2C库函数的代码
void I2C_Send7bitAddress(uint8_t Address, I2C_Direction_TypeDef Direction){ /* Check function parameters */ assert_param(IS_I2C_ADDRESS_OK(Address)); assert_param(IS_I2C_DIRECTION_OK(Direction)); /* Clear bit0 (direction) just in case */ Address &= (uint8_t)0xFE; /* Send the Address + Direction */ I2C->DR = (uint8_t)(Address | (uint8_t)Direction);}
这里
/* Check function parameters */ assert_param(IS_I2C_ADDRESS_OK(Address)); assert_param(IS_I2C_DIRECTION_OK(Direction));注释的两句话就是检测参数是否正确,有一个比较坑的地方就在于, 如果你的地址是八位的,然后最后一位读写位不为0,那么就会出错
STM8这个比较特殊的一点在于,正常7位地址+1位RW位,这个RW位你必须自己留出来,比如某个设备地址是111 1100,我在其他环境下会声明为0x7C
但是在这边,你要用它的库就需要声明为1111 1000,0xF8才可以。
最后一位如果值为1,必出错跳转faild死循环
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月26日 14时10分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
6 个 Linux 运维典型问题
2021-05-08
通过traceroute追踪并打印成图片
2021-05-08
oracle无法启动asm实例记录
2021-05-08
取消vim打开文件全是黄色方法
2021-05-08
YAML基础教程
2021-05-08
一个系统部署多个tomcat实例
2021-05-08
HP服务器设置iLO
2021-05-08
Redhat 平台下LVM管理说明
2021-05-08
oracle数据库迁移
2021-05-08
《Dotnet9》系列-开源C# Winform控件库强力推荐
2021-05-08
从头实现一个WPF条形图
2021-05-08
.NET CORE(C#) WPF 重新设计Instagram
2021-05-08
.NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)
2021-05-08
C# WPF开源控件库:MahApps.Metro
2021-05-08
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2021-05-08
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2021-05-08
GLFW 源码 下载-编译-使用/GLAD配置
2021-05-08
针对单个网站的渗透思路
2021-05-08
Typescript 学习笔记六:接口
2021-05-08