[STM32F1]

没有一个人能把I2C的库函数讲清楚吗?

[复制链接]
10908|82
手机看帖
扫描二维码
随时随地手机跟帖
时光宙宇|  楼主 | 2018-4-15 22:26 | 显示全部楼层 |阅读模式
这是函数库I2C头文件里的内容,但是却没有找到一篇能把这段程序讲解清楚的中文资料。
请论坛里的隐藏高手帮忙解惑!跪谢大神留步
/* I2C Events */
/* EV1 */
#define  I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED       ((u32)0x00060082) /* TRA, BUSY, TXE and ADDR flags */
#define  I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED          ((u32)0x00020002) /* BUSY and ADDR flags */
#define  I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((u32)0x00860080)  /* DUALF, TRA, BUSY and TXE flags */
#define  I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED    ((u32)0x00820000)  /* DUALF and BUSY flags */
#define  I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED        ((u32)0x00120000)  /* GENCALL and BUSY flags */

/* EV2 */
#define  I2C_EVENT_SLAVE_BYTE_RECEIVED                     ((u32)0x00020040)  /* BUSY and RXNE flags */
     
/* EV3 */
#define  I2C_EVENT_SLAVE_BYTE_TRANSMITTED                  ((u32)0x00060084)  /* TRA, BUSY, TXE and BTF flags */

/* EV4 */
#define  I2C_EVENT_SLAVE_STOP_DETECTED                     ((u32)0x00000010)  /* STOPF flag */

/* EV5 */
#define  I2C_EVENT_MASTER_MODE_SELECT                      ((u32)0x00030001)  /* BUSY, MSL and SB flag */

/* EV6 */
#define  I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED        ((u32)0x00070082)  /* BUSY, MSL, ADDR, TXE and TRA flags */
#define  I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED           ((u32)0x00030002)  /* BUSY, MSL and ADDR flags */

/* EV7 */
#define  I2C_EVENT_MASTER_BYTE_RECEIVED                    ((u32)0x00030040)  /* BUSY, MSL and RXNE flags */

/* EV8 */
#define I2C_EVENT_MASTER_BYTE_TRANSMITTING                 ((u32)0x00070080) /* TRA, BUSY, MSL, TXE flags */

/* EV8_2 */
#define  I2C_EVENT_MASTER_BYTE_TRANSMITTED                 ((u32)0x00070084)  /* TRA, BUSY, MSL, TXE and BTF flags */
      
/* EV9 */
#define  I2C_EVENT_MASTER_MODE_ADDRESS10                   ((u32)0x00030008)  /* BUSY, MSL and ADD10 flags */
                                          
/* EV3_2 */
#define  I2C_EVENT_SLAVE_ACK_FAILURE                       ((u32)0x00000400)  /* AF flag */

#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \
                             ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \
                             ((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED) || \
                             ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED) || \
                             ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \
                             ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \
                             ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \
                             ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \
                             ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \
                             ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \
                             ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \
                             ((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \
                             ((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \
                             ((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \
                             ((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \
                             ((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \
                             ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \
                             ((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \
                             ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE))


huzi2099| | 2018-4-15 23:04 | 显示全部楼层
这里没程序,只有定义而已,没中文就看英文吧,做过也未必能全了解,扣得太多也没大用。

使用特权

评论回复
评论
时光宙宇 2018-4-16 14:27 回复TA
因为看了一篇讲调试的文章,里面说:如果想解决掉BUG,那么一定要先把手册读懂,可是我感觉网上的例程全都是是copy的一份源码而已,发帖人也没.... 
blust5| | 2018-4-16 07:56 | 显示全部楼层
I2C一直用的IO口模拟。。。

使用特权

评论回复
评论
时光宙宇 2018-4-16 14:30 回复TA
哦哦,谢谢,如果实在搞不懂的话,我也放弃硬件的 
dalarang| | 2018-4-16 08:33 | 显示全部楼层
像I2C、SPI这类对时序要求不严格的通讯,我一贯都是用模拟的,以确保程序的移植便捷性。除非SPI的速率比较高的情况下。

使用特权

评论回复
评论
时光宙宇 2018-4-16 14:32 回复TA
谢谢,我是读取mpu6050,却看不懂网上写的例程 
gx_huang| | 2018-4-16 09:11 | 显示全部楼层
I2C,我以前用过中断的方式。
优点是系统占用时间少,可以干些别的事情。
缺点是中断函数复杂,一堆的状态转换,需要了解I2C的整个过程以及各种意外处理。

使用特权

评论回复
评论
时光宙宇 2018-4-16 14:34 回复TA
我主要是对各种状态不懂,中文参考手册没有解释,英文的我却看不懂 
挖东衣宇| | 2018-4-16 09:52 | 显示全部楼层
如果st官方没有的话,这一点不够新唐做得好,至少在这些指令上,详细介绍了怎么用

使用特权

评论回复
时光宙宇|  楼主 | 2018-4-16 14:35 | 显示全部楼层
挖东衣宇 发表于 2018-4-16 09:52
如果st官方没有的话,这一点不够新唐做得好,至少在这些指令上,详细介绍了怎么用 ...

谢谢,我去找找看

使用特权

评论回复
gygp| | 2018-4-16 21:47 | 显示全部楼层
STM32 硬件I2C 到底是不是个坑

使用特权

评论回复
chenci2013| | 2018-4-16 21:48 | 显示全部楼层
没用过I2C的库函数的小白路过

使用特权

评论回复
biechedan| | 2018-4-16 21:48 | 显示全部楼层
太浪费时间了

使用特权

评论回复
wangdezhi| | 2018-4-16 21:49 | 显示全部楼层
I2C的库函数可以借鉴别人的经验。

使用特权

评论回复
isseed| | 2018-4-16 21:49 | 显示全部楼层
为什么要使用I2C的库函数呢

使用特权

评论回复
suzhanhua| | 2018-4-16 21:50 | 显示全部楼层
楼主是准备做什么使用呢

使用特权

评论回复
mituzu| | 2018-4-16 21:50 | 显示全部楼层
STM32F1的IIC和SPI都没有搞明白。

使用特权

评论回复
hellosdc| | 2018-4-16 21:51 | 显示全部楼层
https://wenku.baidu.com/view/30763b48be1e650e52ea9979.html

使用特权

评论回复
uiint| | 2018-4-16 21:52 | 显示全部楼层
这个是ST的官网例程吗

使用特权

评论回复
sanfuzi| | 2018-4-16 21:52 | 显示全部楼层
不会用。

使用特权

评论回复
wangdezhi| | 2018-4-16 21:53 | 显示全部楼层
看别人的I2C代码设计的非常不错。

使用特权

评论回复
biechedan| | 2018-4-16 21:53 | 显示全部楼层
调试根本找不到头绪了。

使用特权

评论回复
chenci2013| | 2018-4-16 21:53 | 显示全部楼层
经常使用模拟的,没有用硬件IIC

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝