中级会员
 
- 积分
- 425
- 金钱
- 425
- 注册时间
- 2019-5-12
- 在线时间
- 168 小时
|

楼主 |
发表于 2020-2-18 20:27:17
|
显示全部楼层
本帖最后由 hejun96 于 2020-2-20 21:12 编辑
琢磨出来了
这里解释一下SDA_IN和SDA_OUT如何定义,首先,STM32F104RC连接的AT24C02 SDA
是PB9不是PB7,然后 附上《STM32F1中文参考手册》第8章 GPIO寄存器描述 部分
端口配置低寄存器(GPIOx_CRL) (x=A..E)
偏移地址: 0x00
复位值: 0x4444 4444
31 30 29 28 | 27 26 25 24 | 23 22 21 20 | 19 18 17 16
CNF7[1:0] MODE7[1:0]| CNF6[1:0] MODE6[1:0]| CNF5[1:0] MODE5[1:0]| CNF4[1:0] MODE4[1:0]
rw rw rw rw | rw rw rw rw | rw rw rw rw | rw rw rw rw
GPIO7 | GPIO6 | GPIO5 | GPIO4
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
15 14 13 12 | 11 10 9 8 | 7 6 5 4 | 3 2 1 0
CNF3[1:0] MODE3[1:0]| CNF2[1:0] MODE2[1:0]| CNF1[1:0] MODE1[1:0]| CNF0[1:0] MODE0[1:0]
rw rw rw rw | rw rw rw rw | rw rw rw rw | rw rw rw rw
GPIO3 | GPIO2 | GPIO1 | GPIO0
位31:30 | CNFy[1:0]:端口x配置位(y = 0…7) (Port x configuration bits)
27:26 | 软件通过这些位配置相应的I/O端口,请参考表17端口位配置表。
23:22 | 在输入模式(MODE[1:0]=00):
19:18 | 00:模拟输入模式
15:14 | 01:浮空输入模式(复位后的状态)
11:10 | 10:上拉/下拉输入模式
7:6 | 11:保留
3:2 | 在输出模式(MODE[1:0]>00):
| 00:通用推挽输出模式
| 01:通用开漏输出模式
| 10:复用功能推挽输出模式
| 11:复用功能开漏输出模式
|
位29:28 | MODEy[1:0]:端口x的模式位(y = 0…7) (Port x mode bits)
25:24 | 软件通过这些位配置相应的I/O端口,请参考表17端口位配置表。
21:20 | 00:输入模式(复位后的状态)
17:16 | 01:输出模式,最大速度10MHz
13:12 | 10:输出模式,最大速度2MHz
9:8, 5:4| 11:输出模式,最大速度50MHz
1:0 |
端口配置高寄存器(GPIOx_CRH) (x=A..E)
偏移地址: 0x04
复位值: 0x4444 4444
31 30 29 28 | 27 26 25 24 | 23 22 21 20 | 19 18 17 16
CNF15[1:0] MODE15[1:0]| CNF14[1:0] MODE14[1:0]| CNF13[1:0] MODE13[1:0]| CNF12[1:0] MODE12[1:0]
rw rw rw rw | rw rw rw rw | rw rw rw rw | rw rw rw rw
GPIO15 | GPIO14 | GPIO13 | GPIO12
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
15 14 13 12 | 11 10 9 8 | 7 6 5 4 | 3 2 1 0
CNF11[1:0] MODE11[1:0]| CNF10[1:0] MODE10[1:0]| CNF9[1:0] MODE9[1:0] | CNF8[1:0] MODE8[1:0]
rw rw rw rw | rw rw rw rw| rw rw rw rw | rw rw rw rw
GPIO11 | GPIO10 | GPIO9 | GPIO8
位31:30 | CNFy[1:0]:端口x配置位(y = 8…15) (Port x configuration bits)
27:26 | 软件通过这些位配置相应的I/O端口,请参考表17端口位配置表。
23:22 | 在输入模式(MODE[1:0]=00):
19:18 | 00:模拟输入模式
15:14 | 01:浮空输入模式(复位后的状态)
11:10 | 10:上拉/下拉输入模式
7:6 | 11:保留
3:2 | 在输出模式(MODE[1:0]>00):
| 00:通用推挽输出模式
| 01:通用开漏输出模式
| 10:复用功能推挽输出模式
| 11:复用功能开漏输出模式
|
位29:28 | MODEy[1:0]:端口x的模式位(y = 0…7) (Port x mode bits)
25:24 | 软件通过这些位配置相应的I/O端口,请参考表17端口位配置表。
21:20 | 00:输入模式(复位后的状态)
17:16 | 01:输出模式,最大速度10MHz
13:12 | 10:输出模式,最大速度2MHz
9:8, 5:4| 11:输出模式,最大速度50MHz
1:0 |
#define SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)4<<4;}//PB9
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)3<<4;}//PB9
查表得知,SDA的PB9为GPIO9,所以在CRH中,0XFFFFFF0F 中除GPIO9位为0以外,其他位为F
GPIOB->CRH&=0XFFFFFF0F;//表示选中GPIO9
GPIOB->CRH|=(u32)4<<4;//"4 << 4" 的意思是用GPIO9的bit位是bit4-bit7,把所有的bit位左移4位,
即 0000 0100 << 4 => 0100 0000 此8位分别表示 CNF9[1:0] MODE9[1:0] CNF8[1:0] MODE8[1:0]
"0100" 表示 F9[1:0] MODE9[1:0] "0000"表示 CNF8[1:0] MODE8[1:0] ,得知GPIO8 4位均为0即SCL
那么在上表中查找 在输入模式(MODE[1:0]=00):01:浮空输入模式(复位后的状态) => SDA_IN为浮空输入
同理,3 << 4 => 0000 0011 << 4 => 0011 0000 GPIO8位同样为0即SCL
在输出模式(MODE[1:0]>00): 00:通用推挽输出模式 => SDA_OUT 为通用推挽输出模式
|
|