注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Leo

笑:胸怀,傲:实力,才能笑傲江湖。

 
 
 

日志

 
 

STM32 I2C配置 (转发)  

2011-10-07 19:28:38|  分类: 大学留笔 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

首先配置 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

  评论这张
 
阅读(1858)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017