打印
[STM32F1]

这段程序讲解清楚

[复制链接]
1865|73
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxmmi|  楼主 | 2022-7-9 09:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ev, TE, I2c, AN, slave, AG
这是函数库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))

使用特权

评论回复
沙发
dengdc| | 2022-7-9 10:04 | 只看该作者
这里没程序,只有定义而已,没中文就看英文吧,做过也未必能全了解,扣得太多也没大用。

使用特权

评论回复
板凳
zhenykun| | 2022-7-9 10:10 | 只看该作者
I2C一直用的IO口模拟。。。

使用特权

评论回复
地板
zwll| | 2022-7-9 10:13 | 只看该作者
像I2C、SPI这类对时序要求不严格的通讯,我一贯都是用模拟的

使用特权

评论回复
5
pengf| | 2022-7-9 10:18 | 只看该作者
对,以确保程序的移植便捷性

使用特权

评论回复
6
renyaq| | 2022-7-9 10:21 | 只看该作者
除非SPI的速率比较高的情况下。

使用特权

评论回复
7
xxrs| | 2022-7-9 10:24 | 只看该作者
I2C,我以前用过中断的方式。

使用特权

评论回复
8
heweibig| | 2022-7-9 10:28 | 只看该作者
优点是系统占用时间少,可以干些别的事情。

使用特权

评论回复
9
xxmmi|  楼主 | 2022-7-9 10:30 | 只看该作者
缺点是中断函数复杂,一堆的状态转换,需要了解I2C的整个过程以及各种意外处理。

使用特权

评论回复
10
xxmmi|  楼主 | 2022-7-9 10:34 | 只看该作者
我去找找看

使用特权

评论回复
11
shimx| | 2022-7-9 10:36 | 只看该作者
STM32 硬件I2C 到底是不是个坑

使用特权

评论回复
评论
knk 2022-7-9 10:51 回复TA
不是 
12
zhaoxqi| | 2022-7-9 10:39 | 只看该作者

没用过I2C的库函数的小白路过

使用特权

评论回复
13
dengdc| | 2022-7-9 10:40 | 只看该作者
只是做一个简单的实验,让KEY2按下的时候产生一个中断函数使LED2亮,KEY3按下的时候产生一个中断函数中断使LED3亮,现在的问题是,KEY2和KEY3对应的是同一个中断处理函数 EXTI15_10_IRQHandler,这该怎么办呢?

使用特权

评论回复
评论
knk 2022-7-9 10:52 回复TA
尽量不要使用同一个中断入口,如果使用了同一个中断入口,进中断后要判断IO电平 
14
yszong| | 2022-7-9 10:48 | 只看该作者
太浪费时间了

使用特权

评论回复
15
dingy| | 2022-7-9 10:50 | 只看该作者
I2C的库函数可以借鉴别人的经验。

使用特权

评论回复
16
dengdc| | 2022-7-9 10:54 | 只看该作者
为什么要使用I2C的库函数呢

使用特权

评论回复
17
wyjie| | 2022-7-9 10:56 | 只看该作者
楼主是准备做什么使用呢

使用特权

评论回复
18
juventus9554| | 2022-7-9 11:00 | 只看该作者
STM32F1的IIC和SPI都没有搞明白。

使用特权

评论回复
19
dingy| | 2022-7-9 11:02 | 只看该作者
https://wenku.baidu.com/view/30763b48be1e650e52ea9979.html

使用特权

评论回复
20
zhanghqi| | 2022-7-9 11:05 | 只看该作者
这个是ST的官网例程吗

使用特权

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

本版积分规则

369

主题

4278

帖子

2

粉丝