原创 STM32 I2C 主机模式学习笔记

2008-12-12 12:54 6721 5 5 分类: MCU/ 嵌入式

 


首先配置 I2C


1. 通过 APB 复位 I2C, 使能 I2C 时钟


2. 使能 GPIO 时钟,  配置 GPIO 在 AF OD 模式


3. 使能 I2C ( PE="1")


4. 设置速度参数 FREQ CCR F/S DUTY TRISE


A : CR2.FREQR = 期望的I2C时钟, 一般设置为最大的时钟 36 MHz


确定了 Tck = 1 / FREQ -- 类似于 CANBus 的时间片 Tq


B : PE="0", 设置适当的 CCR F/S DUTY 以及 TRISE, PE="1"


标准模式 Tlow  : Thigh = 1 : 1


快速模式 Tlow : Thigh = 2 : 1 ( DUTY="0") 


快速模式 Tlow : Thigh = 16 : 9 ( DUTY="1") 


以上类似于 CANBus 的 Tseg1, Tseg2


设置 CCR 决定了时钟高低占用的 Tck 个数, 同时确定了时钟的Tbus


标准模式 Tbus = 2 Tck * CCR


快速模式 Tbus = 3 Tck * CCR


快速模式 Tbus = 25 Tck * CCR


首先设置 Tck, 然后根据期望的 TBus 设置 CCR F/S DUTY


假设 Tck = 125ns ( FREQ = 8 Mhz), 期望 100 khz Tbus="10us",  上升时间 Tr = 1000 ns


采用标准模式 F/S = 0  : CCR = Tbus / 2  / Tck = 10 000 /  (1+1)  / 125 = 40 = 0x28


TRISE = ( Tr / Tck ) + 1 = ( 1000 / 125 ) + 1 = 0x09


5. 配置 I2C 模式 : CR1 = ( ACK="1", SMBUS="0",  PE="1" )


 


现在可以正常通讯了


1 发送开始位 ( BUSY = not ( SDA and SCL) ) 只有BUSY = 0 时, 可以发送开始位


A 首先等到 SR2.Busy = 0 ( 总线空闲)


B. 产生开始位(自动切换到主机模式)  设置 CR1.START = 1 后,


C 等待 SR1.SB = 1 (开始位已经发送) -- 通过写入 DR 清除, 或者 PE="0" 清除 SB 位


SR2.BUSY=1 (总线不在空闲)


SR2.MSL=1 (已经切换到主机模式)


2. 发送地址 ( Addr<<1 or R/W)  ( 7位地址模式)


首先清除 AF ( Ack Fail ) 然后设置 DR = ( Addr<<1 or R/W)  然后等待


1.SR1.AF = 1 -- 没有从设备响应


2. SR1.ADDR = 1 -- 从设备响应


首先读取 SR1 : ADDR, TXE  = 1 ( 发送地址时, TXE不会设置为 1 ?)


然后读取 SR2 : BUSY MSL TRA = 1


 


 


 


 


 


 


 

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条