AN50987 Getting Started with I2C in PSoC® 1 (Chinese).pdf

AN50987
PSoC® 1 I2C 入门
作者:Todd Dust 与 M. Ganesh Raja
相关项目:有
相关器件系列:CY8C21x23、21x34、21x45、
22x45、23x33、24x23A、24x33、24x94、27x43、
28xxx、29x66
软件版本:PSoC ® Designer™5.3
AN50987 介绍的是 I2C 标准概况并说明了 PSoC® 1 器件如何处理 I2C 通信。阅读完本应用笔记后,您应了解 I2C 的工
作方式、如何在 PSoC 1 中实现它以及如何为设计选择正确的用户模块。示例项目演示了如何将 PSoC 1 配置为 I2C 主
设备/从设备,以便与总线上的其他 I2C 器件进行通信。
目录
简介 ................................................................................... 2
2
附录 A.............................................................................. 17
I C 的基本知识................................................................... 2
硬件寄存器 ................................................................. 17
物理层........................................................................... 2
固件需求 ..................................................................... 17
协议层........................................................................... 2
PSoC 1 I2C ................................................................... 4
硬件 .............................................................................. 5
附录 B.............................................................................. 20
2
仲裁 ............................................................................ 18
EzI2Cs_ADC_LED_DAC 示例项目............................. 20
I C 用户模块 ................................................................. 6
I2CHW 从设备示例项目 .............................................. 24
固件 ................................................................................... 8
I2CHW 主设备示例项目 .............................................. 25
从设备操作 ................................................................... 8
移植示例项目 .............................................................. 26
主设备操作 ................................................................... 9
全球销售和设计支持 ........................................................ 28
多主设备从设备操作 ................................................... 10
I2Cm ........................................................................... 11
I2C 特别注意事项 ............................................................. 12
I2C 寻址 ...................................................................... 12
上拉电阻 ..................................................................... 12
I2C 和 ISSP 编程冲突 .................................................. 12
上电时引脚短时脉冲 ................................................... 13
时钟速度 ..................................................................... 13
时钟延展和中断延迟 ................................................... 14
热插拔......................................................................... 14
短时脉冲过滤 .............................................................. 14
I2C 和睡眠模式 ............................................................ 14
I2C 和动态重配置 ........................................................ 15
I2CHW 用户模块中的动态从设备寻址 ......................... 15
SCL 线路处于低电平停滞状态 .................................... 15
总结 ................................................................................. 16
www.cypress.com
文档编号: 001- 82514 版本*B
1
®
2
PSoC 1 I C 入门
图 2. 开漏驱动低电平引脚配置
简介
内部集成电路(IIC 或 I2C)是由飞利浦半导体公司(现为
2
NXP)开发的常用芯片间串行通信标准。I C 为集成电路提
供了一种在同一印刷电路板(PCB)上进行通信的简单方
法。I2C 由一个简单的物理层组成,仅需要两个引脚和极少
的外部组件。与 SPI 等通讯标准相比,I2C 的一个优点就是
内置通信协议,使器件之间轻松进行无差错通信。
Vdd
赛普拉斯 PSoC 1 提供了在设计中实现 I C 的多种选择。这
些选择以用户模块(UM)的形式出现在 PSoC Designer™
集成开发环境(IDE)中。本应用笔记先介绍了 I2C 的基本
知识,旨在帮您了解 PSoC 1 器件如何处理 I2C。如果您对
I2C 基础已经有所了解,建议您直接阅读 PSoC 1 I2C。如
果您需要帮助解决 I2C 设计中的故障难题,请直接阅读 I2C
特别注意事项部分的内容。
I2C 的基本知识
物理层
图 1 显示了 I2C 器件与 I2C 总线的连接方式。I2C 总线由两
个物理线路组成,分别是串行数据( SDA)和串行时钟
(SCL)。总线上的所有器件都必须连接至这两条物理线路。
唯一需要的外部硬件就是 SDA 和 SCL 上配备的 VDD(高轨)
上拉电阻。欲了解更多有关上拉电阻的信息,请参见上拉电
阻部分。
图 1. 典型 I2C 总线
SCL
I2C
从设备1
2
本应用笔记假定您已熟悉 PSoC 1 器件和 PSoC Designer
IDE。
SDA
I2C
主设备1
I2C
主设备2
I2C从设备2
将线路
驱动为
低电平
接收数据
I2C 总线上的器件之间的关系是主设备 - 从设备。主设备启
动总线上的所有数据传输,并生成所有时钟信号。每个从设
备都有唯一的一个地址;在开始传输数据之前,主设备必须
先寻址一个特定的从设备并接收一条确认信息。同一总线上
可以同时存在多个主设备和多个从设备。I2C 总线可在不同
频率上运行;典型的频率是 100 kHz 和 400 kHz。I2C 规范
还允许 1 MHz 和 3.4 MHz 的高频率。
根据各个器件的具体情况,I2C 总线的工作电压有所不同。
要确定两个器件是否可以成功通信,请检查各自的数据手册,
确保二者的逻辑电平是兼容的。
如果两个器件的电压和逻辑电平不兼容,可根据 I2C 规范中
提供的解决方案,对不同电压电平的总线进行桥接。
协议层
要掌握本数字通信技术,理解 I2C 的协议层就是下一个主要
步骤。
Vdd
每个 I2C 数据操作都由以下元素组成:启动(或重复启动)、
寻址、数据和停止。
SDA
I2C
主设备1
SCL
启动或重复启动
I2C
从设备1
I2C
从设备2
主设备控制时钟线路,因此它启动总线上的所有通信。要控
制总线并启动数据传输,主设备会首先发送一个启动条件;
请参见图 3。
I2C
主设备2
SDA 和 SCL 都是双向的;数据可以在主设备和从设备之间
来回传送。SDA 和 SCL 具有开漏驱动模式并被驱动为低电
平。器件能够将线路驱动至逻辑低电平或高阻抗状态,也就
是说,器件不能将这些线路驱动至高电平。这种配置可防止
总线上发生电源和地的短路;请参见图 2。SDA 和 SCL 上
的上拉电阻产生高逻辑电平。
www.cypress.com
启动条件向总线上的所有器件发送信号,通知主设备已经控
制了总线,并将发送一个地址。此时,总线即被视为繁忙,
其他主设备必须等待停止条件使总线恢复空闲状态后,才能
启动数据传输。
启动 = SCL 为高电平时,SDA 从高电平转变为低电平
文档编号: 001- 82514 版本*B
2
®
2
PSoC 1 I C 入门
图 3. 启动条件
图 5. 10 位地址
启动
S
11110XX
R/W A/N
XXXXXXXX
地址最高的两位有效位
SDA
A/N
剩余的8位
数据
SCL
重复启动条件在物理层面上与启动条件相同。它表示主设备
已经维持对总线的控制而且该总线没有处于闲置状态。
地址
主设备发出启动条件后,发送的第一个数据字节就是地址。
每个从设备都有唯一的地址。大多数 I2C 地址的长度都为七
个数据位。读/写(R/W)位凑满 8 位字节并指出接下来数
据传输的通信方向;请参考图 4。“读”代表主设备希望从
设备中读取数据。“写”表明主设备希望向从设备中写入数
据。所有地址和数据字节都优先发送最高有效位(MSB)。
主设备发送地址而且从设备确认后,每次可以传送八位数据。
主设备和从设备都可以传送和接收,因此它们一起拥有
SDA 线的控制权。
SDA 线上的数据在 SCL 的上升沿前必须保持稳定状态。仅
当 SCL 为低电平时,才能更改 SDA 上的数据;请参见图 6。
图 6. SDA 数据更改
SDA
稳定
数据
SCL
例如,如果一个 7 位地址为 0x20,则代表“读”的完整 8
位字节为 0x40;代表“写”的完整 8 位字节为 0x41。
图 4. 7 位地址
主设备执行写入操作时,在 SDA 上写出八位的数据,并在
SCL 上提供八个时钟周期。主设备发送八位数据后,从设
备负责在第九个时钟周期发送 ACK 或者 NAK 信号;请参
考图 7。
ACK
SDA
D7
D1
R/W
SCL
1
7
8
数据
变化
9
AC K / N AK
主设备发送地址后,等待从设备发出确认(ACK)信息。
ACK 是一个附加的状态位,位于每个数据字节的末尾,
因此,所有 I2C 数据传输的长度都是九位。


ACK = 从设备有足够空间容纳更多数据
NAK = 从设备无法容纳更多数据
交替条件表明主设备希望在从设备中读取数据。在这种情况
下,主设备会提供八个时钟周期,但是从设备在 SDA 上传
输八个数据位。传输八个数据位后,主设备必须发送 ACK
或 NAK 信号。
总线上所有从设备都要读取接收到的地址,并将其与自己的
内部地址进行比较。如果地址相匹配,从设备必须在第九个
时钟循环发出 ACK 信息。如果地址不相匹配,从设备将不
响应(发出 NAK 信息)。




图 7. 八个数据位后面是一个 ACK 位
ACK = 0 (低逻辑电平)
ACK = 主设备希望读取更多数据
NAK = 主设备读取完毕
注意: 从设备无法通知主设备没有要发送的数据。
NAK = 1 (高逻辑电平)
ACK
10 位地址
I2C 规范还允许使用 10 位地址;请参考图 5。要使用此类地
址,必须向从设备发送两个地址字节。第一个字节包含的内
容有:序列 11110、地址的两个最高有效位、R/W 位;
从设备必须确认该字节。然后,主设备发送剩余的八位地址。
最后,从设备发送 ACK/NAK。
SDA
D7
D1
D0
SCL
1
7
8
9
停止
发送所有字节后,主设备要发送一个停止条件。停止条件表
明当前数据传输已完成,总线处于闲置状态;请参见图 8。
停止 = SCL 为高电平时,SDA 从低电平转变至高电平
www.cypress.com
文档编号: 001- 82514 版本*B
3
®
2
PSoC 1 I C 入门
图 8. 停止条件
如图 10 所示,当一个主设备将 SDA 保持为高电平,而另
一个主设备尝试将 SDA 驱动至低电平时,前者仲裁失败,
必须等待。
停止
图 10. 仲裁
SDA
SCL
SCL
除了发送停止条件之外,主设备还可以发送重复启动条件。
重复启动条件在物理层面上与启动条件相同。当主设备想要
通知从设备开始新的数据传输或者更改数据流的方向时,主
设备会发送重复启动条件,这样可以保持对总线的控制。
Device
#1 SDA
1
0
Lost Arbitration
Stops Driving
SDA
Device
#2 SDA
1
0
0
1
SDA of
Bus
1
0
0
1
当主设备想要向特定的从设备写入数据,然后反过来从该从
设备中读取数据时,需要使用重复启动条件。通过使用重复
启动条件,主设备可以维持对总线的控制。如果使用停止条
件,则总线可能由其他主设备控制。
更多有关 I2C 及其协议的信息,请参考飞利浦(NXP)的
I2C 规范。
全部放在一起
图 9 显示的是包含两个字节的主设备读取和包含两个字节
的主设备写入的完整数据传输。另外它还显示一个先写入两
个字节然后读取两个字节的重复启动示例。
在 PSoC 1 中,专用 I2C 硬件模块处理 I2C 数据传输,帮助
CPU 解除处理流程产生的负担,并使 CPU 可以处理重要的
实时任务。在大多数 PSoC 1 器件中,该模块的基本结构相
似;请参见表 1,了解不同器件系列之间的差异。
图 9. 完成数据传输
表 1. I2C 硬件模块差异
数据
R A
主设备写入
S
地址
从设备
硬件地址
匹配
两个 I C
模块
20x34
无
有
无
无
20xx6A
无
有
有
无
21x23
有
有
无
无
21x34
有
有
无
无
重复启动示例:
主设备读取随后的主设备写入
S
W A
地址
R A
22xxx/21x45
有
有
无
无
23x33
有
有
无
无
S = 启动
W = 写入
R = 读取
A = ACK
N = NAK
P = 停止
地址 = 7位从设备地址
24x23A
有
有
无
无
自主设备到从设备
24x94
有
有
无
无
自从设备到主设备
27x43
有
有
无
无
28xxx
有
有
有
有
29x66
有
有
无
无
A
数据
W A
A
数据
数据
A
A
2
主设备
器件
主设备读取
S
地址
地址
PSoC 1 I2C
数据
N P
数据
N P
数据
数据
A S
N P
仲裁
I2C 协议允许多个主设备在同一总线上进行通信。两个主设
备可以同时进行通信。为了防止数据丢失,每个 I2C 主设备
都必须查看 I2C 总线,确保总线上的数据为自己所提供。如
果数据不匹配,仲裁失败的 I2C 主设备必须停止驱动 SDA
线,并等待总线闲置后再重新尝试发送数据。
www.cypress.com
文档编号: 001- 82514 版本*B
4
®
2
PSoC 1 I C 入门
表 2. 字节完成中断
硬件
如图 11 所示,硬件模块允许端口 1.5、1.0、1.7 和 1.1 连
接到 I2C 总线上。赛普拉斯建议不要将端口 1.1 和 1.0 连接
到 I2C 上,因为这些线路为编程接口。
图 11. I2C 硬件模块
SDA_OUT
SDA_IN
SDO
端口1[5] 或
端口1[0]
发送器
8 位数据及
ACK/NAK 信号后
8 位数据后
接收器
8 位数据后
8 位数据及
ACK/NAK 信号后
欲了解 I2C 硬件模块功能的更多信息,请参见附录 A 及
PSoC 技术参考手册中 I2C 部分的内容。
I2CBLK
I2C总线
SDO
CY8C28xxx 中的硬件模块
SCL
SDI
GPIO
I2CEN
从设备
SDI
GPIO
SCL_IN
主设备
SDA
SDE
SCL_OUT
模式
端口1[7] 或
端口1[1]
SDE
硬件模块是一个简单的模块,能够处理 I2C 数据传输的所有
状态和时序需求。该模块处于主设备模式时,会生成 I2C 时
钟。另外它也将 I2C 数据输入和输出 PSoC 1 并记录 I2C 数
据传输的状态和错误。
中断和数据传输队列
模块每次只能接收或传送一个字节的数据。另外它还会在每
个字节边界上生成一个中断。CPU 必须响应中断的要求,
为模块提供更多的数据,或者读取模块接收到的数据。
CPU 不需要立即响应模块的需求,因为模块会将 SCL 线保
持在低电平状态,直到 CPU 进行释放为止;这一过程就是
时钟延展。欲了解更多信息,请参见时钟延展和中断延迟部
分的内容。
模块每次仅能够将一个数据传输加入队列。不能在模块中排
列多个启动。因此,用户代码必须保证当前 I2C 数据传输完
成后,再启动新的数据传输。
CY8C28xxx 器件系列提供两个单独 I2C 硬件模块,允许硬
件同时能与多个 I2C 总线相连。此外,每个模块还提供硬件
地址匹配功能。仅当地址匹配时,硬件才会中断 CPU 活动。
然而,不能将 PSoC 1 从睡眠状态中唤醒。中断地址匹配后,
硬件会根据表 2 中列出的条件中断 CPU 活动。
CY8C28xxx 器件系列中的每个硬件模块允许其他 I2C 引脚
连接至端口 1.2 和 1.6 或端口 3.0 和 3.2。
拥有两个 I2C 的硬件模块可以实现很多强大的应用。表 3 列
出了可以实现的某些应用。
表 3. 双 I2C 配置和常见使用情况
配置
常见用法
2
2
两个 I C 从设备
多个 I C 总线系统
2
I C 共享存储器件
2
2
一个 I C 从设备,一个 I C
主设备或多主设备
2
I C 总线开关
2
I C 热插拔控制器
2
在多主设备环境中,模块会自动探测并报告仲裁条件。出现
仲裁事件时,模块会报告 CPU 仲裁失败。用户代码应查看
仲裁是否失败。如果是,则该代码将重新尝试传输。
I C 缓冲区
调试
2
两个 I C 主设备或多主设备
增加带宽
2
如果发生以下任意情况,I C 硬件模块将生成中断:总线错
误、停止或字节完成。
如果总线上启动或停止条件的位置出现错误,则发生总线错
误。发生总线错误后,总线上的所有器件必须停止当前的传
输并回到空闲状态。
如果它被使能,那么只要总线上出现停止条件,便会发生停
止中断。
根据数据流的不同方向,会在不同时间点触发字节完成中断;
请参见表 2。该表格适用于地址和数据传输。
www.cypress.com
文档编号: 001- 82514 版本*B
5
®
2
PSoC 1 I C 入门
I2C 用户模块
2
赛普拉斯提供一系列预配置和预编码的 I C 用户模块
(UM),这些模块位于 UM 目录中的 PSoC Designer 内;
请参考图 12。
图 12. PSoC Designer 中的 I2C 用户模块
是否被按下。在这种情况下,将 CapSense 变量公开给
EzI2C 用户模块,主设备即可轻松读取 CapSense 按键的
状态。
EzI2C 根据基于 I2C 的存储器(如 EEPROM)进行建模。
它使用子地址寻址方式,在公开的 I2C 数据结构的具体数据
位置内写入或读取数据。例如,要考虑下面所示的 I2C 数据
结构:
struct MyI2C_Regs {
BYTE bStat;
BYTE bCmd;
int iVolts;
char cStr[6];
} MyI2C_Regs
上述数据将通过以下存储器映射公开给主设备。
如果将这些 UM 应用于设计中,您在 PSoC Designer 的芯
片视图中无法看到它们。这是因为这些用户模块使用专用的
硬件模块,或者为软件主设备。仅在 28xxx 系列中才使用
数字模块;这时,芯片视图显示两个 I2C 硬件模块,因此您
就能够了解哪些模块已使用,哪些未使用;请参见图 13。
图 13. 28xxx 中的两个 I2C 模块
I2C 用户模块包含了 EzI2C 和 I2CHW 的,它提供的抽象层
次高于 I2C 硬件模块。本章节内容简要介绍了各种用户模块,
以及设计中何时需要应用该模块。欲了解更多信息,请参见
特殊用户模块的数据手册。
EzI2C
Ezl2C 仅作为从设备运行;没有主设备版本。如果在一个设
计中需要主设备操作,那么就必须使用 I2CHW 或 I2Cm。
顾名思义,EzI2C 是一种易于实现的 I2C 从设备接口。它是
I2C 硬件模块之上的固件层。它能够实现附录 A 中硬件模块
描述内提到的所有固件要求。
EzI2C 用户模块十分特别,只需要用户了解很少的 I2C 总线
工作知识即可。该模块允许用户在用户代码中建立一个数据
结构,并将该结构公开给 I2C 主设备。所有 I2C 数据传输都
通过中断在后台发生。用户模块启动后,您无需担心 I2C 的
功能出现问题。应用代码需要完成的就是使用主设备要读取
的数据更新数据结构,并检查和处理主设备写入的数据。
0x00
MyI2C_Regs.bStat
0x01
MyI2C_Regs.bCmd
0x02
MyI2C_Regs.iVolts(MSB)
0x03
MyI2C_Regs.iVolts(LSB)
0x04
MyI2C_Regs.cStr[0]
0x05
MyI2C_Regs.cStr[1]
0x06
MyI2C_Regs.cStr[2]
0x07
MyI2C_Regs.cStr[3]
0x08
MyI2C_Regs.cStr[4]
0x09
MyI2C_Regs.cStr[5]
如果主设备希望写入 iVolts,则应先发送从设备地址,然后
发送指示架构中 iVolts 偏移的子地址(0x02)。要计算该
偏移,只需在计数 iVolts 之前先计数字节数即可;在此示例
中,子地址为‘2’。还可以扩展该示例,如果子地址为
‘0’,则会写入 bStat,子地址为‘1’则会写入 bCmd,
子地址为‘4’则会写入 cStr 阵列的第一个元素。图 14 显
示了主设备将数据写入 EzI2Cs 用户模块中 iVolts 的示例
(该用户模块中具有 0x04 的从设备地址)。
图 14. EzI2Cs 示例:写入 iVolts
从设备地址
S
0x04
子地址
WA
0x02
向iVolts写入数据的地址
A
0x55
A
0xAA
A P
如果主设备希望读取 iVolts,则需要先 PSoC 从设备进行寻
址,并写入子地址‘2’。然后再次对从设备进行寻址,并
读取两个字节。后续每次读取都从 iVolts 开始,直到写入新
的子地址为止。图 15 显示了主设备读取 iVolts 中数据的
示例。
当 PSoC 需要持续向主设备传送数据且用户希望写入最少
的 I2C 代码时,最适宜使用该用户模块。例如,该用户模块
在 CapSense®应用中十分常用。PSoC 读取 CapSense 按
键的状态,主设备连续与 PSoC 进行通信,旨在查看按键
www.cypress.com
文档编号: 001- 82514 版本*B
6
®
2
PSoC 1 I C 入门
I2C_Pins:该参数用于选择 I2C 时钟和数据使用的引脚。
图 15. EzI2Cs 示例:读取 iVolts
从设备地址
S
0x04
0x02
R A
0x55
从设备地址
S
0x04
UM 参 数 配 置 完 成 后 , 请 按 照 以 下 步 骤 在 固 件 中 运 行
EzI2Cs。
子地址
WA
A P
从iVolts读取数据的地址
A
0xAA
1.
A P
创建数据结构以公开给主设备。例如:
structMyI2C_Regs {
BYTE bStat;
BYTE bCmd;
int iVolts;
char cStr[6];
} MyI2C_Regs
现在请看一下如何在项目中实现 EzI2Cs。图 16 介绍了
该项目的参数。
图 16. EzI2Cs UM 参数
2.
通过调用 EzI2Cs_Start 函数启动 EzI2Cs。
3.
通过调用 EzI2Cs_EnableInt 函数启动中断。
4.
使用 EzI2Cs_RamSetBuffer 函数将数据结构公开给主
设备。
EzI2Cs_SetRamBuffer(sizeof(MyI2C_Regs),
2, (char*)&MyI2C_Regs);
Slave_Addr:该参数用于设置 EzI2Cs 从设备的地址。如
果 ROM_Registers 参数被禁用,那么 Slave_Addr 即为 7
位地址,其取值范围为 0 到 127。如果使能了
ROM_Registers 参数,则 Slave_Addr 为 6 位地址,取值
范围为 0 到 63。
Address_Type:如果地址类型被设置为静态,则 EzI2Cs
从设备的地址固定为 Slave_Addr 参数所设定的值。如果地
址类型被设为动态,则可以通过 EzI2Cs_SetAddr 函数进行
修改固件中的地址。在应用中,如果总线上有一个以上的
PSoC 1 EzI2Cs 从设备,则该参数很有帮助,可以通过配
置 GPIO 引脚设置从设备的地址。
ROM_Registers:使能 ROM_Registers 参数,则可以向
I2C 主设备公开存储在 ROM 阵列中的数据。使能该参数后,
EzI2Cs 将向主设备公开两个地址。如果主设备想要访问
ROM 储存器空间,那么需要使用一个第七位已被设置的 7
位地址。如果要访问 RAM 储存器空间,则使用一个第七位
已被清空的 7 位地址。例如,如果 Slave_Addr 被设为
0x04,则主设备将使用 0x44 的地址对从设备进行寻址,以
便访问 ROM 寄存器,并使用 0x04 的地址对从设备进行寻
址以访问 RAM 寄存器。这就是使能 ROM 寄存器时,
Slave_Addr 参数应设为 6 位地址的原因。
I2C_Clock:使用该参数设置从设备能够运行的最高速度。
请注意,该最高速度是基于 24 MHz 的 SYSCLK 得出的。
如果在全局资源中,将 SYSCLK 设为 6 MHz 或 12 MHz
(已使能 SLIMO),最大时钟速度也将以相同的系数减少。
例如,如果 I2C_Clock 参数被设为 400 kHz,SysClk 被设
为 6 MHz,则从设备的实际速度将是 100 kHz。请参见时
钟速度部分的内容,了解更多详细信息。
www.cypress.com
第一个参数用于设置缓冲区大小。第二个参数设置写入
边界,第三个参数启动指向数据结构的指针。
EzI2Cs 允许通过 SetRamBuffer 函数定义数据结构上
的读/写权限。例如,如步骤 1 中所显示的代码,该应
用将为 bStat 和 bCmd 变量设置读/写权限,并将写入
边界设置为‘2’,使其他变量成为只读变量。在这种
情况下,如果主设备尝试向只读变量写入数据,则从设
备会生成 NAK 消息,忽略主设备写入的数据。
5.
在主循环中,不断刷新主设备将读取的处理数据结构,
并不断从主设备寻找新的数据。
使用 EzI2Cs UM 时要考虑的一个要点就是数据连贯性。在
示例中,iVolts 是一个双字节变量。很可能在 CPU 开始更
新该变量,但仅写入一个字节后,I2C 主设备就读取了两个
字节。因此,主设备将读取到错误的数据。例如,假设变量
iVolts 的值为 0x01FF。CPU 需要将其更新为 0x0200。
CPU 先将 0x02 写入到最高有效位(MSB)内,然后再将
0x00 写入到最低有效位(LSB)内。如果 I2C 仅在 CPU 写
入到最高有效位内但尚未完成向最低有效位的写入操作时读
取数据,则读取到的数据将是 0x2FF。
要避免发生这种情况,最好在主设备和从设备间使用标记或
信号来指示数据可被读取或写入的时间。EzI2Cs 数据手册
详细介绍了保证数据连贯性的其他方法。
此应用笔记包含一个简单项目,用于演示如何使用 EzI2Cs
用户模块。有关如何使用该项目的更多信息,请参见附录 B。
要详细了解该用户模块的工作方法以及使用方法,请参见
EzI2Cs 数据手册。
文档编号: 001- 82514 版本*B
7
®
2
PSoC 1 I C 入门
EzI2Cs 是一个仅作为从设备且易于实现的用户模块。
Multimaster and Slave Operation(多主设备和从设备
操作):如需在多主设备环境中将 I2CHW 用作为主设备和
从设备,请选择此选项。
EzI2Cs 向具有明确读/写权限的主设备公开寄存器结构。
根据您所选择的选项,相应的用户模块窗口将会弹出。
使能 ROM 寄存器后,从设备会有两个地址,一个用于
RAM 空间(已清除第七位),一个用于 ROM 空间(已设
置第七位)。因此,使能 ROM 寄存器后,从设备地址仅
限于 6 位。
Slave_Addr:这是 7 位从设备地址。与 EzI2Cs 不同,
I2CHW 不会对 ROM 缓冲区进行动态寻址,亦不会为其提
供单独地址。在多主设备和从设备操作中,Slave_Addr 是
被总线上另一主设备作为从设备进行寻址的器件的地址。
在 EzI2Cs 中处理多字节值时,请务必在主设备和从设备
之间使用标记或信号,以保证数据连贯性。
Read_Buffer_Type:选中“RAM only”(仅 RAM)时,
应用程序可设置仅读取 RAM 中的缓冲区。当您选中“RAM
or FLASH”(RAM 或闪存)时,应用程序可向主设备公开
RAM 缓冲区或闪存缓冲区。
EzI2Cs 总结和重要说明
I2CHW
该用户模块是 I2C 硬件模块之上的固件层,用于实现附录 A
中所指定的全部固件任务。您可以灵活使用该用户模块,将
其作为从设备、主设备或多主从设备。
与 EzI2Cs 不同,I2CHW 用户模块需要更多代码交互。必须
选中状态位以查看 I2C 数据传输操作是否发生,数据传输完
成后,必须重新初始化缓冲器,且清除状态位。此外,还要
查看固件,检查数据传输过程中是否出现错误条件。
下面将会介绍在项目中如何使用 I2CHW。双击打开 I2CHW
拓扑结构选择窗口。请查看 图 17。
图 17. I2CHW 拓扑结构窗口
Communication Service Type(通信服务类型):选中
“Interrupt”(中断)时,系统将在中断期间自动处理所有
I2C 数据传输操作。当您选中“Polled”(轮询)时,系统
仅在前台应用程序调用 I2CHW_Poll 函数时才会处理 I2C 数
据传输操作。硬件会持续延展 I2C 时钟,直至应用程序调用
I2CHW_Poll 为止。赛普拉斯建议您选择“Interrupt”(中
断)选项。
I2C_Clock:此参数用于选择从设备的速度。 如 EzI2Cs 从
设 备 的 时 钟 参 数 部 分 所 述 , 此 速 度 基 于 24 MHz 的
SYSCLK。
I2C_Pins:该参数用于选择 I2C 使用的引脚。除
CY8C28xxx 外,所有器件均可选用 P1[0]-P1[1]和 P1[5]P1[7]。CY8C28xxx 还可选用 P1[2]-P1[6]和 P3[0]-P3[2]。
固件
配置完拓扑结构和参数后,请遵循下列步骤在固件中运行
I2CHW。
从设备操作
1.
Slave Operation(从设备操作):如需执行从设备操作,
请选择此选项。
Single Master Operation(单一主设备操作):如需在单
一主设备环境中执行简单的主设备操作,请选择此选项。
主 设 备 操 作 中 有 三 个 参 数 可 用 : Read_Buffer_Type 、
I2C_Clock 和 I2C_Pin。这三个参数的配置与下面“从设备
操作”部分中所述相同。
www.cypress.com
在 RAM(或闪存)中声明一个读取缓冲区,以供主设
备读取数据。例如:
BYTE ReadBuffer[16];
缓冲区可为以下结构:
struct ReadBuffer {
BYTE bStatus;
int iVolts;
}ReadBuffer;
文档编号: 001- 82514 版本*B
8
®
2
PSoC 1 I C 入门
2.
I2CHW_InitRamRead(ReadBuffer,
sizeof(ReadBuffer));
}
在 RAM 中声明一个写入缓冲区,以供主设备写入数据。
例如:
BYTE WriteBuffer[16];
请务必检查 RD_COMPLETE 标志并重新初始化缓冲区。
否则,日后读取主设备时,会重复传输缓冲区中的最后
一个字节。
缓冲区可为以下结构:
struct WriteBuffer {
BYTE bCmd;
int iDACCounts;
}WriteBuffer;
3.
8.
通过调用 M8C_EnableGInt 宏使能全局中断。
请务必使能全局中断,因为所有 I2C 操作均在 I2C ISR
内部后台执行。
// Check if a write operation is over
if (I2CHW_bReadI2CStatus() &
I2CHW_WR_COMPLETE)
{
// Process data from Master
调用 I2CHW_Start、I2CHW_EnableSlave 和
I2CHW_EnableInt 函数以启动从设备。
// Clear the flag
I2CHW_ClrWrStatus();
M8C_EnableGInt ;
4.
I2CHW_Start();
I2CHW_EnableSlave();
I2CHW_EnableInt();
5.
6.
利用 I2CHW_InitRamRead 初始化读取缓冲区。
// Re-initialize the buffer
I2CHW_InitWrite(WriteBuffer,
sizeof(WriteBuffer));
}
I2CHW_InitRamRead(ReadBuffer,
sizeof(ReadBuffer));
请务必重新初始化写入缓冲区,否则从设备将会否认主
设备中的所有后续数据。
此函数用于初始化指向读取缓冲区的指针,并设置缓冲
区的大小。每当主设备尝试从从设备读取数据时,数据
都会从缓冲区自动传输至主设备。如果主设备试图读取
的字节数超出了缓冲区的大小,就会重复传输缓冲区的
最后一个字节。
该应用笔记中的一个简单项目将演示如何将 I2CHW 用作为
2
从设备,用于回响由 I C 主设备写入的数据。有关该项目的
更多信息,请参见附录 B。
利用 I2CHW_InitWrite 函数初始化写入缓冲区。
1.
主设备操作
I2CHW_InitWrite(WriteBuffer,
sizeof(WriteBuffer));
此函数用于初始化指向写入缓冲区的指针,并设置缓冲
区的大小。主设备将数据写入到从设备时,该数据会自
动存入缓冲区内。如果主设备试图写入的字节数超出了
缓冲区的大小,则从设备会否认并丢弃这些额外的字节
数。
7.
调用函数 I2CHW_bReadI2CStatus 并检查
I2CHW_WR_COMPLETE 标志。如果已设置此标志,
表示主设备已完成写入数据操作。处理数据,清除标志,
重新初始化写入缓冲区。
调用函数 I2CHW_bReadI2CStatus 并检查
I2CHW_RD_COMPLETE 标志。如果已设置此标志,
表示主设备已完成读取数据操作。清除状态标志,重新
初始化读取缓冲区。
// Check if a read operation is over
if (I2CHW_bReadI2CStatus()
I2CHW_RD_COMPLETE)
{
// Prepare fresh data for Master
// Clear the flag
I2CHW_ClrRdStatus();
在 RAM(或闪存)中声明一个读取缓冲区,以供储存
自从设备读取的数据。例如:
BYTE ReadBuffer[16];
缓冲区的结构也可以与上面所述的“从设备操作”部分
中讨论的结构相似。
2.
在 RAM 中指明一个写入缓冲区,用于写入 I2C 从设备
的数据。例如:
BYTE WriteBuffer[16];
3.
通过调用 M8C_EnableGInt 宏使能全局中断。
M8C_EnableGInt;
请务必使能全局中断,因为所有 I2C 操作均在 I2C ISR
内部后台执行。
4.
调用 I2CHW_Start、I2CHW_EnableMstr 和
I2CHW_EnableInt 函数以启动主设备。
I2CHW_Start();
I2CHW_EnableMstr();
I2CHW_EnableInt();
// Re-initialize the buffer
www.cypress.com
文档编号: 001- 82514 版本*B
9
®
2
PSoC 1 I C 入门
5.
I2CHW_Start();
I2CHW_EnableMstr();
I2CHW_EnableSlave();
I2CHW_EnableInt();
利用 I2CHW_bWriteBytes 函数向从设备写入数据。
I2CHW_bWriteBytes(0x50, WriteBuffer, 16,
I2CHW_CompleteXfer);
第一个参数是从设备地址;使用 7 位从设备地址。在
I2C 总线上发送地址之前,bWriteBytes 函数会自动将
读/写位添加至 7 位地址。第二个参数是指向存有从设
备数据的缓冲区的指针。第三个参数是要写入从设备的
字节数。第四个参数是数据传输类型,共有三个不同的
值 : I2CHW_CompleteXfer 、 I2CHW_NoStop 和
I2CHW_RepStart。
当您使用 I2CHW_CompleteXfer 时,系统将执行一个
完整的 I2C 数据传输操作,其中包括起始位、地址字节、
数据字节和停止位。如果您使用 I2CHW_NoStop,写
入数据之后不会生成停止位。使用 NoStop 的数据传输
操作后可以紧跟一个使用了 I2CHW_RepStart 函数的
数据传输操作。通常情况下,建议在执行大多数 I2C 数
据操作中使用 I2CHW_CompleteXfer。
3.
4.
I2CHW_bWriteByte 函数用于初始化指向缓冲区的指针、
设置计数值,以及启动 I2C 硬件中的起始位。之后,所
有操作均在 ISR 内部执行。每次传输完一个字节,I2C
硬件就生成一个中断,而 ISR 负责递增指向缓冲区的
指针,将下一个字节传输至从设备,并在传输完所有字
节后生成一个停止位。
6.
使用 I2CHW_bReadI2CStatus 函数检查写入操作是否
已完成,如果完成则清除标志。例如:
while(!(I2CHW_bReadI2CStatus() &
I2CHW_WR_COMPLETE));
I2CHW_ClrWrStatus();
上述代码会一直等待,直到 WR_COMPLETE 标志被
设置为止。除了“while”语句,也可以使用“if”条件
2
语句;在后台执行 I C 数据传输时,处理器还可处理其
他事务。
7.
5.
16,
2.
调用 I2CHW_EnableMstr 和 I2CHW_EnableSlave 函
数以使能主设备和从设备模式,调用
I2CHW_EnableInt 函数以使能中断。
www.cypress.com

调用 I2CHW_bReadSlaveStatus 函数。

检查 I2CHW_RD_COMPLETE 和
I2CHW_WR_COMPLETE 标志。如果已设置这些
标志,则重新初始化缓冲区。
负责主设备一方操作的固件需要处理一些特殊情况。在
多主设备环境中,如果一个主设备(姑且称为主设备 1)
试图启动针对从设备的数据传输操作,可能有三种不同
的情景,具体取决于其他主设备(假设总线中存在另一
个主设备,即主设备 2)的活动。
a.
总线处于空闲状态,主设备 1 启动并完成一个读
取或写入数据传输操作。
b.
主设备 2 已经启动了与总线上的其他从设备进行
的数据传输操作,因此总线处于繁忙状态。主设备
1 必须等到总线空闲,然后才能启动数传输操作。
c.
主设备 1 启动一个读取或写入数据传输操作,与
此同时,主设备 2 也启动一个数据传输操作。这
种情况会引发仲裁。如果主设备 1 赢得仲裁,则
完成数据传输操作。如果主设备 1 仲裁失败,则
必须在主设备 2 完成其数据操作后,再重试数据
传输操作。有关仲裁的详细信息,请参阅附录 A。
要写入从设备,请调用 I2CHW_bWriteBytesNoStall。
要读取从设备,请调用 I2CHW_fReadBytesNoStall。
这些函数会在启动数据传输操作之前检查总线是否繁忙。
如果总线繁忙,这些函数会返回 0xFF。固件应检查返
回值,如果该值为 0xFF,则重试数据传输操作。例如,
以下代码会循环执行操作,直到
I2CHW_bWriteBytesNoStall 返回一个不是 0xFF 的值
为止。
除了可以使用被阻塞的“while”循环语句外,还可以
使用“if”条件语句检查返回值。如果返回值为 0xFF,
您可能在一段固定时间后重试数据传输操作。
在多主设备从设备模式下,I2CHW 可在多主设备环境中作
为主设备和从设备使用。
调用 I2CHW_Start 函数。
分配读和写缓冲区;调用
I2CHW_InitSlaveRamRead 和
I2CHW_InitSlaveWrite 函数以便对这些缓冲区进
行初始化。
while(I2CHW_bWriteBytesNoStall(0x50,
WriteBuffer, 16, I2CHW_CompleteXfer) ==
0xFF);
多主设备从设备操作
1.

I2CHW 提供了多个单独的函数,以供主设备处理多主
设备环境。
使用 I2CHW_fReadBytes 函数以便启动对从设备进行
的读取操作。使用 I2CHW_bReadI2CStatus 函数并检
查 I2CHW_RD_COMPLETE 标志,然后清除读取状态。
I2CHW_fReadBytes(0x50, ReadBuffer,
I2CHW_CompleteXfer);
while(!(I2CHW_bReadI2CStatus() &
I2CHW_RD_COMPLETE));
I2CHW_ClrRdStatus();
从设备模式操作与单个从设备操作相似,但函数名称却
有所不同。
6.
如果启动读取或写入操作时未出现总线繁忙错误,固件
应继续检查操作是否完成或主设备的仲裁是否失败。以
下为执行此操作的示例代码。
文档编号: 001- 82514 版本*B
10
®
2
PSoC 1 I C 入门
while((!(I2CHW_bReadMasterStatus() &
I2CHW_WR_COMPLETE)) &&
(!(I2CHW_bReadBusStatus() &
I2CHW_LOST_ARB)));
if (I2CHW_bReadMasterStatus() &
I2CHW_WR_COMPLETE)
{
// Write is completed successfully.
// Clear flag
I2CHW_ClrMasterWrStatus();
}
if (I2CHW_bReadBusStatus() &
I2CHW_LOST_ARB)
{
// Master lost arbitration. Retry
later
}
在单芯片需要多个主设备,或未提供连接 I2C 硬件所需引脚
的情况下,I2Cm 是最佳选择。如果仅需一个主设备,且提
供了 P1.5 与 P1.7 或 P1.0 与 P1.1,赛普赖斯建议您采用
2
I CHW 来执行主设备操作。
第一行指令会被循环执行,直至写入完成或
LOST_ARB 错误标志被设置为止。“while”循环终止
时,代码会检查是哪一条件导致循环终止。如果已设置
WR_COMPLETE 标志,则清除该标志。如果已设置
LOST_ARB 标志,则稍后重试数据传输操作。
该用户模块的工作方式是,操控运行其端口的驱动模式寄存
器(PRTxDMx)和数据寄存器(PRTxDR)。正因如此,
在用户代码中操作这些寄存器时,请务必小心谨慎,否则
I2C 通信会受到不良影响。避免出问题的最好方法是,在写
入到与 I2Cm 引脚相关的驱动模式寄存器和数据寄存器内时,
使用影像寄存器。
此应用笔记包含一个简单项目,用于演示如何使用 I2CHW
UM 读取标准 EEPROM。有关详细信息,请参考附录 B。
有关更多信息,请参阅 I2CHW UM 数据手册和技术参考手
册的 I2C 章节。
I2CHW 总结和重要说明
I2CHW 可在单一主设备、单一从设备或多主设备从设备等
模式中运行。
在从设备模式下,当主设备完成读取或写入时,缓冲区必
须重新初始化,以执行下一个数据操作。
在多主设备环境的主设备模式下,固件必须检查
bWriteBytesNoStall 和 fReadBytesNoStall 函 数 的 返 回
值,以确定总线是否繁忙,然后重试数据传输。
在多主设备环境的主设备模式下,启动读取或写入数据操
作时,固件应检查该数据传输操作是否顺利完成,或该主
设备是否在仲裁上输给了另一个主设备。如果主设备仲裁
失败,则需重试数据传输操作。
I2Cm
PSoC 1 中的另一个用户模块,即 I2Cm,通过软件操作控
制通用 I/O 端口引脚来实施 I2C 主设备。该用户模块不采用
I2C 硬件模块,也不存在 I2C 软件从设备用户模块。
该用户模块相对于 I2CHW 的优势在于,它可用于任何一对
引脚,而非仅限于 P1.5 与 P1.7 或 P1.0 与 P1.1。 缺点是
它需要更多的 CPU 开销,而且不支持多主设备操作。执行
I2C 数据传输操作期间,它需要占用 100%CPU。第二个劣
势是,它仅支持  100 kHz 的总线频率。
www.cypress.com
请遵循下列步骤在项目中运行此用户模块。
1.
使用 I2Cm_Start 函数启动该用户模块。
2.
要将数据从 RAM 缓冲区写入到一个从设备,请使用
I2Cm_bWriteBytes 函数。此函数接受从设备地址、指
向 RAM(或 ROM)中源数据的指针以及要传送的字
节数。
3.
要自从设备读取数据,请使用 I2Cm_fReadBytes 函数。
此函数接受从设备地址、指向保存所读数据的目标缓冲
区的指针以及要读取的字节数。
当 I2Cm 用户模块被置于项目中时,PSoC Designer 会自动
创建适用于数据寄存器和两个驱动模式寄存器(PRTxDM0
和 PRTxDM1)的影像寄存器。因为 PRTxDM2 不会受该用
户模块影响,PSoC Designer 不会为该寄存器创建影像寄
存器。
在 psocconfig.asm 和 psocgpioint.h 文件中定义这些影像寄
存器。例如,如果 I2Cm 被置于 Port0 中,将在
psocconfig.asm 文件中定义下列变量。
; write only register shadows
_Port_0_Data_SHADE:
Port_0_Data_SHADE:
BLK
_Port_0_DriveMode_0_SHADE:
Port_0_DriveMode_0_SHADE:
1
BLK
1
BLK
1
_Port_0_DriveMode_1_SHADE:
Port_0_DriveMode_1_SHADE:
以下定义位于 psocgpioint.h 文件中。
extern BYTE Port_0_Data_SHADE;
extern BYTE Port_0_DriveMode_0_SHADE;
extern BYTE Port_0_DriveMode_1_SHADE;
应用程序代码使用这些影像寄存器向数据寄存器和驱动模式
寄存器进行写入。例如,如果应用程序要设置 P0[0],则应
使用下列代码:
// Write to PRT0DR through shadow register
Port_0_Data_SHADE |= 0x01;
PRT0DR = Port_0_Data_SHADE;
使用 PRT0DMx 寄存器将 P0[0]设置为强驱动模式:
// Write to PRT0DM0 through shadow register
Port_0_DriveMode_0_SHADE |= 0x01;
PRT0DM0 = Port_0_DriveMode_0_SHADE;
文档编号: 001- 82514 版本*B
11
®
2
PSoC 1 I C 入门
// Write to PRT0DM1 through shadow register
Port_0_DriveMode_1_SHADE &= ~0x01;
PRT0DM1 = Port_0_DriveMode_1_SHADE;
// Write to PRT0DM2 directly
PRT0DM2 &= ~0x01;
I2C 寻址
I2C 从设备地址有两种常见的描述方法。第一种方法是使用
7 位地址,没有读/写位,例如 0x42。这是赛普拉斯的用户
模块处理 I2C 从设备地址的方式。
第二种方法是在地址中加入读/写位(例如 0x84/0x85)。
有关需要使用影像寄存器的情况的更多信息,请参考影像寄
存器数据库.
请确保知悉您所用器件的寻址方式。
目前为止,赛普拉斯尚未支持 10 位从设备地址。
2
有关此用户模块的详细信息,请参阅 I Cm 数据手册。
2
I Cm 总结和重要说明
I2Cm 是 I2C 主设备的软件实现,不会占用 I2C 硬件资源。
I2Cm 对从设备进行读取或写入时,会使用全部 CPU 资
源。
如果应用程序代码需写入到 I2Cm 所在端口的数据寄存器
或驱动模式寄存器内,请务必谨慎使用影像寄存器,以免
I2C 接口出现问题。
上拉电阻
I2C 设计中另一个常见注意事项是上拉电阻的值。应根据通
信频率和总线电容选择该电阻值。较大的总线电容和上拉电
阻会延长时钟或数据线路的上升时间。I2C 规范列明了最大
上升时间。
如果总线上升时间大于该最大上升时间,I2C 通信无法正常
进行。I2C 规格中提供了如图 18 所示的曲线图,帮助用户
确定上拉电阻的值。RS 是串联电阻,I2C 规范中规定了 RS
最大值。
对于大多数系统而言,上拉电阻值的范围为 2.2 k 到 4 k。
I2C 特别注意事项
图 18. 上拉电阻值
I2C 为器件间相互通信提供了一种简易方式。与任何设计一
样,该设计过程中也可能出现问题。本章节旨在帮您解决
I2C 设计过程中所遇到的常见问题,避免可能遇到的难题。
它包括下面各主题:











7 位和 10 位寻址
上拉电阻的注意事项
共享 I2C 和 ISSP 引脚
上电时所发生的短时脉冲
SYSCLK 和 I2C 时钟的速度
时钟延展和中断延迟
热插拔
短时脉冲过滤
I2C 和睡眠模式
I2C 和动态重配置
I2CHW 中的动态寻址
www.cypress.com
I2C 和 ISSP 编程冲突
将 I2C 与 PSoC 配合使用时的,一个常见注意事项是选择要
用的引脚。使用硬件模块时,I2C 可使用这两对固定引脚:
(P1.5,P1.7)和(P1.0,P1.1)。(在 28xxx 系列中,
您还可以使用 P1.2 和 P1.6 或 P3.0 和 P3.2。)您也可以使
用 P1.0 和 P1.1 引脚来编程 PSoC。这些线路上的上拉电阻
会导致系统内编程出错。
编程期间,P1.0 使用电阻下拉驱动模式强制降低线路上的
逻辑电平。下拉电阻约为 5.6 k。内部下拉电阻和外部 I2C
上拉电阻形成了一个电压分频器。该电压分频器在线路上应
用一个不确定或高逻辑电平,而编程器不会将此电平视为所
需的低逻辑电平。这便会导致编程失败。如需确定合适的电
压电平,请参阅器件特定数据手册中的 DC 编程规范和通用
I/O 逻辑电平。
文档编号: 001- 82514 版本*B
12
®
2
PSoC 1 I C 入门
最佳解决方法是使用 P1.5 和 P1.7 引脚。如果需要,才能
使用 P1.0 和 P1.1 这对引脚。另一个选择是,在 PSoC 中
将 P1.0 与 P1.1 的驱动模式更改为上拉模式,而不是使用
外部上拉电阻。内部上拉电阻约为 5.6 k。
上电时引脚短时脉冲
时钟速度
如前所述,当处于主设备模式时,I2C 硬件负责在 SCL 上
生成时钟。PSoC 1 中可用的 I2C 时钟频率为 50 kHz、100
kHz 和 400 kHz。这些频率是基于系统时钟(SYSCLK)固
定连接的时钟分频器得到的。
如前面所述,P1.0 和 P1.1 用于编程,也就是说,上电时这
些引脚的行为不同于其他引脚。
此类时钟分频器生成采样时钟;这些采样时钟对 I2C 线路进
行 16 倍或 32 倍过采样。表 4 列出了内部采用率。
器件从复位释放后,P1.0 会被驱动为强驱动高电平。这时,
如果总线上有其他 I2C 器件驱动低电平,就会导致故障。
P1.1 将被驱动为电阻式低电平。如前所述,这将在总线上
形成一个电压分频器和中间电压,而其他器件可能无法识别
此电压。超过设置的时间量后,P1.0 跃变为电阻式低电平,
因此在该线路上引发中间电压。
表 4. 内部采样率
PSoC 启动时,如果其他 I2C 器件被充电,且与 P1.0 和
P1.1 相连,则您需要注意上述行为及其对总线上 I2C 器件
的影响。
要避免发生此问题,应在 I2C 通信中采用 P1.5 与 P1.7。或
需要采取措施,尽可能地减少复位期间引脚行为对 P1.0 与
P1.1 的影响。简单来做,可以将所有其他器件保持在复位
状态,直至 PSoC 启动为止。也可以采用较为复杂的解决
方案,例如利用转换器选通 PSoC 的输出或逻辑门。请参
见图 19。
SYSCLK
预分频器
内部采样时钟频率
(SYSCLK = 24 MHz)
样品数/位
50 kHz
/16
1.5 MHz
32
100 kHz
/4
1.5 MHz
16
400 kHz
/16
6 MHz
16
时钟频率
内 部 采 样 时 钟 假 设 SYSCLK 的 频 率 为 24 MHz 。 如 果
SYSCLK 的频率低于 24 MHz,则 I2C 时钟会变慢。例如,
如果 SYSCLK 为 12 MHz,则可用速度为 25 kHz、50 kHz
和 200 kHz。如果 SYSCLK 为 6 MHz,则 I2C 的可用速度
为 12.5 kHz、25 kHz 和 100 kHz。(请参考表 5。)
表 5. 实际频率与 IMO 和用户模块设置
图 19. 隔离 PSoC
IMO(SYSCLK)设置
S
D
I2C SDA
用户模块设置
PSoC
引脚1_0
24 MHz
12 MHz
6 MHz
400 kHz
400 kHz
200 kHz
100 kHz
引脚1_1
100 kHz
100 kHz
50 kHz
25 kHz
引脚X
(用于使能I2C)
50 kHz
50 kHz
25 kHz
12.5 kHz
BSS145
G
D
I2C SCL
S
BSS145
G
100k
注意: SYSCLK 独立于 CPU_Clock。
注意:

请务必在此模块中准确放置 N 通道 FET,以便 FET 的
源极连接至 PSoC GPIO 引脚。

FET 需要采用 N 通道,并必须有 VGSTH 的额定值≤
PSoC Vdd。举例来说,如果 PSoC Vdd = 3.3 V,则选
择 VGSTH 的额定值 ≤ 3.3 V 的一个通道 N,即 FET。

将引脚 X 设置为强驱动并将‘1’写入到该引脚内,从
而连接到 I2C 总线。
www.cypress.com
在从设备模式下操作时,此规则同样适用于 I2C 模块可读取
的最高时钟速度。过采样时钟用于监控 I2C 线路。在从设备
模式下所设置的速率表示硬件对时钟和数据线路进行过采样
的频率。
如果 I2C 时钟频率为 400 kHz,并且硬件被配置为 100 kHz,
则硬件无法正常接收数据。一个常见错误是,在 PSoC
Designer 中将 I2C 从设备时钟频率设置为 100 kHz,而将
SYSCLK 设置为 6 MHz。认为从设备将在 100 kHz 的总线
上运行的想法是错误的。因为 SYSCL 为 6 MHz,所以从设
备仅能在 25 kHz 的总线上运行。由此可见,要在 SYSCLK
为 6 MHz 的情况下,在 100 kHz 的总线上运行,必须在用
户模块属性中将 I2C 速度选为 400 kHz。
文档编号: 001- 82514 版本*B
13
®
2
PSoC 1 I C 入门
SYSCLK 的频率取决于 PSoC 的供电电压。如果供电电压
超过 3 V,则大多数器件的 SYSCLK 为 24 MHz。如果供电
电压小于 3 V,则大多数器件的 SYSCLK 为 6 MHz。有多
个器件可选择 12 MHz 的 SYSCLK。此外,可在 PSoC
Designer 中更改 SYSCLK 的值。使用 I2C 时,请勿更改
SYSCLK 或 CPU_CLK 的频率,否则会导致在 I2C 线路上
发生短时脉冲。有关时钟的更多信息,请参见技术参考手册
的“时钟”章节中的内容。
图 21. 字节完成中断时序
最大
4周期
内部
采样
时钟
SCL
中断
使用外部时钟时,请确保使用正确的 I2C 时钟速度。
传输:第九个正向沿SCL
接收:第八个正向沿SCL
时钟延展和中断延迟
时钟延展是从设备将时钟线路保持在低电平状态,从而停止
主设备在总线上进一步通信的过程。通常情况下,从设备延
展时钟是为了处理接收自主设备的信息,或准备更多数据以
发送至主设备。时钟延展可在数据传输操作的任何时间点完
成。PSoC 在字节完成中断后延展时钟。请参见图 20。
I2C 规范表明时钟延展为可选功能;并非所有 I2C 器件均需
支持此功能。不过,所有赛普拉斯 PSoC 1 I2C 从设备用户
模块都具备延展时钟功能。如果您所用的主设备不支持时钟
延展,则总线会锁定且无法复位。
图 20. 时钟延展示例
START
R/W
7位地址
ACK
1
7
8
通过此信息,您可以确定时钟是否将被延展及延展多长时间。
不过,如果系统中有其他中断,则应将这些中断耗时考虑在
内。
要最小化 PSoC 中的时钟延展时间,第一步是将 CPU 的运
行速度控制在 24 MHz。接下来,I2C 时钟速度必须不超过
100 kHz。最后,尽量减少中断,以缩短时钟延展时间。
热插拔
热插拔是将已充电的器件连接至未充电的 PSoC 的过程。
PSoC 中 I2C 的设计尚不支持热插拔。对 PSoC 进行热插拔
时需考虑若干因素。第一个问题是反向供电。如果 PSoC
未充电,但是一个外部引脚处于高压状态,则可能向 PSoC
器件反向供电。这是我们不希望看到的情况,因为 PSoC
可能被意外执行,并且 I2C 线路可能受到负面影响。
9
短时脉冲过滤
时钟延展
SCL 的输入有一个短时脉冲过滤,如图 22 所示。
PSoC 从设备延展时钟所需时间长短取决于以下几个因素:
主设备对从设备进行的是读操作还是写操作,系统中是否发
生了其他中断,以及 CPU 的速度。
图 22. SCL 短时脉冲过滤
输入
SCL引脚
2
在 I C 总线速度等于或高于 100 kHz 的情况下,PSoC 1 器
件的时钟延展时间会增加。EzI2Cs 和 I2CHW UM 中的 ISR
代码包含 150 至 300 个 CPU 指令循环。在 CPU 时钟为 24
MHz 时,ISR(中断服务子程序)执行时间约为 6 至 13 µs。
ISR 代码执行完毕后,将释放 SCL 线路。
在 SCL 上升沿后三到四个内部采样时钟周期中触发 ISR,
请参见图 21。这是因为 SCL 上有一个内部短时脉冲过滤;
请参见图 22。请参见表 4 以更加了解采样时钟的频率。这
意味着 ISR 将在 SCL 上升沿后约 2.5 µs 被触发。100 kHz
时钟的正常周期是 10 µs。如果触发 ISR 需要 2.5 µs,且执
行 ISR 需要 6 至 13 µs,则大部分情况下都会发生时钟延展。
0
1
采样
时钟
输入与采样时钟双重同步,然后进行短时脉冲过滤。原始输
入和延迟输入必须相互匹配,这样才能传送信号。因为采样
时钟为 1.5 MHz 或 6 MHz,相应地,小于 666 ns 和 166
ns 的短时脉冲将被抑制。
I2C 和睡眠模式
如果在具有进入和退出睡眠模式操作的设计中使用了 I2C,
那么需要特别注意以下几项。
首先,I2C 进入睡眠模式之前,务必完成所有 I2C 数据传输
操作。否则,器件被唤醒时,I2C 时钟会将数据错误解读为
地址,或者将地址解读为数据。确定所有 I2C 通信均已停止
后,请执行以下步骤:
www.cypress.com
文档编号: 001- 82514 版本*B
14
®
2
PSoC 1 I C 入门


配置 I2C 引脚为 HIGHZ 驱动模式。
要将 RAM 变量代替该常量,请按照这些步骤执行操作:
禁用 I2C 模块。通常,可以通过调用用户模块的 Stop()
API 完成此操作。
1.

清除所有待处理的 I2C 中断。
export _I2CSlaveAddress
export I2CSlaveAddress
满足上述条件之后,PSoC 可进入睡眠状态。当器件从睡眠
状态被唤醒时,执行以下步骤以确保 I2C 在经过睡眠后可正
确运行:




在变量分配区域,添加下列代码:
Area InterruptRAM(ram)
_I2CSlaveAddress:
I2CSlaveAddress:
BLK
确保总线上没有任何 I2C 活动。
调用相应的 Start API。
2.
使能中断。
I2C 用户模块应位于基础配置或始终加载着的单独外覆层中。
3.
EzI2Cs UM 允许您通过编程方式随时更改 I2C 从设备地址。
2
不过,I CHW UM 不具备此功能;若要实现相同功能,请
执行以下步骤:
在 I2CHW 用 户 模 块 中 , 从 主 设 备 所 接 收 的 地 址 将 在
I2CHW_1int.asm 文件内部进行处理。以下代码用于执行地
址匹配功能。
A, reg[I2CHW_1_DR]
F, 0xF9
A
A, I2CHW_1_SLAVE_ADDR
从主设备接收的地址包括一个 7 位地址和读/写位。“rrc A”
放弃读/写位,将 7 位地址与常量
I2CHW_1_SLAVE_ADDR 进行比较,该常量由器件编辑器
根据 I2CHW 的 UM 参数中所设置的 Slave_Addr 而创建。
此常量位于 I2CHW_1.inc 文件中。
A, reg[I2CHW_1_DR]
F, 0xF9
A
A, [I2CSlaveAddress]
因为此代码位于自定义用户代码区域内,应用程序生成
期间对用户模块库文件的更改将予以保留。请注意,如
果重命名了用户模块,这些更改将被丢失,需要重新进
行更改。
切勿通过动态重配置加载或卸载 I2C 用户模块。它们应始终
存在,如被加载或卸载,则将发生 I2C 错误。
I2CHW 用户模块中的动态从设备寻址
修改用于比较地址的代码。
mov
and
rrc
xor
I2C 和动态重配置
要 为 I2CHW_1int.asm 文 件 中 定 义 的 I2C Slave
Address 变量添加一个引用,只需将下列代码添加至
main.c(或任何其他 C 语言文件)内。
extern BYTE I2CSlaveAddress;
SCL 线路处于低电平停滞状态
使用 I2C 时遇见的一个常见问题是 SCL 处于低电平停滞状
态。以下内容可指导您调试和解决 PSoC 1 器件中的这个问
题。
1.
您是否在 PSoC Designer 5.0 SP5 中使用 EzI2Cs?如
果为“是”,该版本的用户模块中存在一个已知缺陷,
它 会 导 致 SCL 线 路 处 于 低 电 平 停 滞 状 态 。 更 新 至
PSoC Designer 的最新版本即可修复此问题。请参见
I2C 时钟始终为逻辑低电平停滞状态文章。
2.
使用 PD5.0 之前,您是否使用 PSoC Designer 版本?
如果为“是”,则 P1.5 与 P1.7 在上电时会有短时脉
冲。此问题已在 PSoC Designer 的最新版本中妥当解
决。更多有关信息,请参考上电时 I2C 线路上发生短时
脉冲文章。
3.
主设备是否支持时钟延展?如果为“否”,从设备和主
设备之间的通信会不同步,而且可能发生意外行为,包
括 SCL 处于低电平停滞状态。如果主设备不支持时钟
延展,则无法保证 PSoC 在总线上正常运行。
4.
代码执行期间,CPU 时钟或 SYSCLK 是否会动态更改?
如果为“是”,这会导致在 SCL 和 SDA 线路上发生短
时脉冲。为避免该问题,请勿在代码中更改时钟速度。
图 23. I2CHW 用户模块从设备地址
www.cypress.com
1
带‘_’的变量可在 C 语言代码中进行修改。
配置 I2C 引脚为开漏低电平驱动模式。
在结合使用 I2C 和睡眠模式时,只要遵循这些步骤,便能够
避免大多数错误。
mov
and
rrc
xor
创 建 一 个 RAM 变 量 以 保 存 动 态 从 设 备 地 址 。 在
I2CHW_1int.asm 文件中的变量分配区域下,有一个自
定义用户代码区域。在自定义声明区域,添加此代码:
文档编号: 001- 82514 版本*B
15
®
2
PSoC 1 I C 入门
5.
6.
7.
您是否在代码中是能和禁用了 I2C 中断?如果为“是”,
请务必使用 ResumeInt API 而非 EnableInt API。如果
有待处理的 I2C 中断而且被您清除了,SCL 将永远停
滞在低电平状态。
PSoC 启动时总线上是否有其他 I2C 通信?如果为
“是”,则表示存在一个已知缺陷,不过最新版本的
PSoC Designer 已修复该缺陷。如果您没有最新版本,
且无法更新,可采用以下解决方法:在芯片编辑器中,
将 I2C 引脚的驱动模式设为模拟 High-Z 模式。在主代
码中使能 I2C 用户模块。然后将 I2C 引脚的驱动模式设
为开漏低电平驱动模式。
项目中是否使用了睡眠模式?如果为“是”,请遵循
“睡眠模式”章节中讨论的步骤,以避免发生任何问题。
最新版本的 PSoC Designer 已修复和解决了上述大部分问
题。赛普拉斯始终建议使用 PSoC Designer 的最新版本。
关于作者
姓名:
Todd Dust
职务:
应用工程师
背景:
西雅图太平洋大学电气工程学
(BSEE) 学士学位
联系地址:
[email protected]
姓名:
M. Ganesh Raaja
职务:
首席应用工程师
背景:
Ganesh 毕业于印度本地治里中央直辖
区的莫逖拉尔·尼赫鲁理工学院
(Motilal Nehru Govt. Polytechnic)电
子与通信工程专业。 他在模拟电路设计
和 微 控 制 器 方 面 拥 有 20 年 经 验 。
他还在赛普拉斯公司网站上开通了名为
“PSoC Hacker”的博客。
联系地址:
[email protected]
总结
I2C 是一个简单的两线制芯片对芯片数字通信协议。该协议
面向主设备,但允许在两条通信线路上进行双向通信。
赛 普 拉 斯 PSoC 提 供 了 多 个 用 户 模 块 , 以 便 在 设 计 中
实施 I2C,其中包括从设备、主设备和多主设备配置。如果
您严格遵守了赛普拉斯所建议的注意事项,那么在 PSoC
中实现 I2C 通信会变得非常简单可靠。
www.cypress.com
文档编号: 001- 82514 版本*B
16
®
2
PSoC 1 I C 入门
附录 A
本附录是针对希望详细了解 PSoC 中 I2C 硬件模块的操作的
用户。
硬件寄存器
有多个寄存器用于控制 I2C 硬件模块和报告其状态。
2
I2C_CFG 寄存器:控制 I C 硬件模块的配置。它控制时钟
速度和所用的引脚,并且指示是否使能了从设备或主设备的
功能,同时还支持出现停止条件和总线错误时启动中断。
I2C_SCR 寄存器:返回 I2C 硬件模块中的状态标志。它报
告是否发送或接收到一个完整字节(字节完成)。该寄存器
指示是否发生了总线错误还是仲裁失败。它还可确定最后一
个数据操作是否为一个地址。
I2C_DR 寄存器:该寄存器保存已发送或接收的数据值。仅
在下面三种情况下,它才对数据进行移位:数据是一个地址;
将硬件模块配置为从设备并对它进行寻址;主设备初始化读
取操作。
I2C_MSCR 寄存器:该寄存器用于控制 I2C 数据操作的主
设备部分,并保存允许生成“启动”条件的位。必须设置
I2C_CFG 寄存器中的使能主设备的位,该寄存器才可用;
否则寄存器会保持在复位状态。
固件需求
本章节介绍了不同配置下固件模块的操作。请注意,文中无
论何处提及固件需求,所有 PSoC I2C 用户模块均运行该代
码。
启动生成
如果在主设备状态和控制寄存器中设置 start gen(启动生
成)位,硬件模块会生成一个启动条件,然后发送数据寄存
器中的地址。但是,该硬件可识别是否有其他器件在控制总
线。如果检测到外部启动条件,硬件会将当前启动列入到队
列中,直到总线进入空闲状态为止。直到硬件成功发出启动
条件,才清除该启动位;或者使用固件清除它。
每一次只能将一个启动条件列入队列。总线繁忙时,如果主
设备试图发送两个启动条件,硬件仅会发送最后一个地址。
如前所述,用户代码必须确保不会发生这种情况。
固件还通过设置 SCR 寄存器中的传输位来设定通信的方向。
如果将‘0’写入该位,则模块将被置于接收模式。在该模
式下,硬件会在接收到八个数据位时中断 CPU。中断后,
固件必须确定是否需要发送 ACK/NAK。
如果将‘1’写入传输位,则模块将被置于传输模式。在该
模式下,硬件会在接收到从设备发出的 ACK/NAK 后中断
CPU。然后固件将再次处理这些情况。
写入到 SCR 寄存器时,主设备将开始生成时钟以发送或接
收更多数据。
从设备操作
在从设备模式下,硬件在检测到启动条件时,会将下一个八
位数据移入 I2C_DR 寄存器内。接收到第八位数据时,硬
件模块会中断 CPU,并使 I2C_SCR 寄存器中的地址位变
为高电平。
发布中断后,硬件将时钟线路保持在低电平。随后,固件负
责读取输入的地址,并确认该地址是否为自己的地址。固件
必须适当地设置 SCR 寄存器中的 ACK 位。固件还需要读
取该地址的读/写位。如果该位为‘1’,则 SCR 寄存器中
的传输位需要改为‘1’。CPU 写入至 SCR 寄存器后,硬
件释放时钟线路,这样能够继续进行数据操作。
如果将从设备配置为发送器,那么固件必须将有效的数据加
载到 DR 寄存器内,然后再写入到 SCR 寄存器并释放总线。
总线释放后,硬件在主设备提供的时钟沿上将数据移出至
SDA 线路。硬件会一直等到接收到主设备发出的 ACK/NAK,
然后将中断 CPU。这时,固件必须加载新数据或不执行任
何操作。
如果将从设备配置为接收器,硬件会在收到第八位数据后中
断 CPU。固件将决定是否能够接收更多数据。然后,必须
设置相应的 ACK 位。
停止条件
在主设备模式下,当完成了某个数据操作时,硬件模块将生
成停止条件,以指示总线处于空闲状态。
在从设备模式下,收到停止条件后,硬件模块会进入闲置模
式,直至接收到新的启动条件。
主设备操作
在主设备模式下,发送启动条件和地址后,硬件会一直等到
收到从设备发出的 ACK/NAK 位。接收到 ACK/NAK 位时,
硬件会中断 CPU。随后,固件将确定从设备是否已确认该
地址。固件需要通过读取 I2C_SCR 寄存器中最后接收到的
数据位(LRB)来实现该操作。如果该数据位的值为‘0’,
则表示从设备已确认了该地址;如果该数据位为‘1’,则
表示从设备未确认该地址。应根据这种情况采取相应的措施。
www.cypress.com
文档编号: 001- 82514 版本*B
17
®
2
PSoC 1 I C 入门
中断源
仲裁
在之前的示例中,硬件模块在收到字节完成条件后会中断
CPU。此类中断的发生取决于通信的方向。
硬件模块还可以指示主设备的仲裁是否失败。在多主设备模
式下操作时,该功能非常重要。当两个主设备同时开始进行
写操作时,便会发生仲裁。硬件监控 SDA 线路。如果主设
备试图将总线保持为高电平,而另一个主设备则将其拉低,
那么表示前者仲裁失败。仲裁条件发生后,硬件不再控制
SDL 线路,但会继续给 SCL 线路提供时钟脉冲。在后续字
节完成中断时,固件将检查仲裁失败位,以查看上一传输过
程中,仲裁是否失败。


发送:字节完成中断 = 第九位
接收:字节完成中断 = 第八位
硬件模块支持其他两个中断源。通过设置 I2C_CFG 寄存器
中的相应位,即可启用这些中断。硬件可在收到停止条件后
进行中断。在从设备模式下运行时,该功能非常有用;该中
断可提醒固件当前数据操作已完成。还可以在发生总线错误
(即启动或停止条件在总线上出现了错误)时生成中断。如
果硬件检测到该中断,那么它将停止当前的操作,并发出中
断请求;此时固件会决定如何处理这种情况。
I2C 的基本流程
图 24 和图 25 显示了 I2C 数据操作的基本流程。这是在
PSoC 1 中成功实施 I2C 应遵循的基本流程。所提供的用户
模块遵循该流程时会增加开销。
图 24. 用于成功配置从设备发送器/接收器的流程图
主设备发送
其他字节
通过写入到
发送字节后
SCL线路保持 I2C_CSR寄存器,
将会生成一个中断。 为低电平。
CPU向该寄存器
发送ACK/NAK
命令。
CPU对
I2C_SCR
寄存器进行写入
(ACK)
1
7
8
写入(RX)
ACK/
NAK
1
7
8
CPU读取从I2C_D寄存
器接收到的字节并检查
“Own Address”(自
己的地址)和R/W。
9
NAK = 从设备无
法接受更多字节。
CPU读取从
I2C_D寄存器接收到
的字节。
读取(TX)
START
STOP
8位数据
ACK
生成了一个字节中断。 SCL线路
保持为低电平
状态。
R/W
7位地址
ACK = 从设备可以接
受更多字节。主设备
可以继续发送字节或
停止发送操作。.
CPU写入字节
以传输到
I2C_D寄存器。
CPU向I2C_CSR寄存器
进行写入
(ACK | TRANSMIT)
完成传输
一个字节和ACK/NAK后
将会生成一个中断。
SCL线路保持为
低电平状态。
8位数据
ACK
ACK/
NAK
9
1
7
8
NAK = 主设备停
止发送数据。
STOP
9
ACK = 主设备
想要读取
其他字节。
CPU将一个新字节写入到I2C_D
寄存器,然后将TRANSMIT命令
写入到I2C_SCR以释放SCL。
www.cypress.com
文档编号: 001- 82514 版本*B
18
®
2
PSoC 1 I C 入门
图 25. 用于成功配置主设备发送器/接收器的流程图
CPU将ACK/NAK命
令发送到 I2C_SCR
寄存器。
完成发送字节后
将会生成
一个中断。
ACK/
NAK
收到ACK后
将会生成一个中断
1
R/W
7位地址
ACK
7
8
9
读取(RX)
START
STOP
8位数据
CPU将一个命令
发送到I2C_CSR。
CPU将
GENERATE
START 命令
发送到
I2C_MCR。
ACK = 主设备
想要发送更多
的数据。
NAK = 主设备
停止发送数据。
CPU读取
从I2C_D 寄存器
收到的字节。
CPU将地址字节写入
到I2C_D寄存器内。
7
8
9
写入(TX)
CPU检查读/写位
1
CPU将TRANSMIT命令
发送到I2C_SCR
寄存器,启动传送流程。
CPU进行写入一个字
节以传输I2C_D
寄存器。
完成传输
字节和ACK/NAK后
将会生成一个中断。
8位数据
ACK/
NAK
1
7
8
CPU发送
STOP 命令
NAK = 从设备
无法接受
更多数据。
STOP
9
ACK = 从设备
可以接受更多
数据。主设备
可以继续发送
或停止操作。
这设备想要发送
更多字节。
www.cypress.com
文档编号: 001- 82514 版本*B
19
®
2
PSoC 1 I C 入门
附录 B
该附录介绍了多种示例项目, 通过这些项目演示了 I2C 用
户模块(UM)的用途。
EzI2Cs_ADC_LED_DAC 示例项目
该项目用于演示如何配置 EzI2Cs UM。该项目将 PSoC 配
置为 I2C 从设备,并且可将其作为一个实现了由 I2C 控制的
模拟外设器件以及端口扩展器。
该项目创建了下面的数据结构:
struct I2CRegs
{
BYTE LEDValue;/* Updates LEDs */
BYTE DACValue;/* Updates DAC */
BYTE ADCValue;/* Reads ADC value */
}I2CRegs;
在固件中创建了 LEDValue 和 DACValue 的局部副本。将
2
I C 寄存器结构中的 LEDVAlue 和 DACValue 值连续同这些
参数的局部副本进行比较。当主设备写入另一个 DAC 值或
LED 值时,将会使用新的值来更新 LED 端口(P0[0]到
P0[3])和 DAC。DA 输出可用于 P0[5]。
测试项目
图 27 显示了项目测试所需的设置。使用一个 CY3210
PSoC 1 评估板对设置的对象进行布线。
9
J
CONNECTOR
根据图 26 配置芯片中的 EzI2Cs UM。
SDATA
5
SCLK
0
1
2
3
1
4
C
C
V
6
J11
2
1
BRIDGE
I2C
/
ISSP
7
P1[3]
1
5
SDATA
4
SCLK
3
S
E
R
X
2
0
1
1
8
1
SCL/P1[7]
第一个参数设置数据结构的大小。第二个参数则用于设置可
读/写参数的数量。不属于该范围的参数均为只读参数的。
在该结构中,LEDValue 和 DACValue 都是读/写参数的,
并且 ADCValue 为只读参数。最后的参数为指向数据结构
自身的指针。
VSS
P1[6]
1
SDA/P1[5]
1
EXTCLK/P1[4]
S
E
9
1
R
X
4
1
S
E
R
SMP
9
P1[2]
1
XtalIn/SCLK/P1[1]
1
XtalOut/SDATA/P1[0]
1
2,
X
EzI2Cs_1_SetRamBuffer(sizeof(I2CRegs),
(BYTE *) &I2CRegs);
3
LCD_D7
1
LCD_D6
1
LCD_D5
LCD_RW
3
1
LCD_D4
LCD_RS
1
LCD_E
2
9
LCD_D7
8
LCD_D6
1
7
LCD_D5
6
LCD_E
LCD_D4
0
2
P2[7]
5
VREF/P2[6]
Ext
2
P2[5]
6
AGND/P2[4]
Ext
2
P2[3]
7
P2[2]
2
P2[1]
8
P2[0]
4
2
4
5
2
3
6
7
P0[7]
1
P0[6]
2
P0[5]
通过调用以下 API,可以将该结构通知给 I2C 主设备:
2
P0[4]
2
P0[3]
4
D
E
L
T
U
O
V
R
V
P0[2]
3
D
E
L
P0[1]
2
D
E
L
P0[0]
1
D
E
L
5
LCD_RW
4
LCD_RS
8
C
C
V
2
3
C
C
V
CY8C29466-24PXI
2
CONTRAST
LCD
2
U
1
6
R
LCD
C
C
V
图 27. EzI2Cs_ADC_LED_DAC_Project 的原理图
将 P0[0]至 P0[3]分别连接到 J5 上的 LED1 至 LED4 信号。
将 P0[7]连接到可变电阻 VR。将数字万用表连接到 P0[5],
以监控 DAC 输出。将 LCD 连接到 LCD 连接器(J9)。
通过 CY3217 MiniProg1 或 CY8CKIT-002 MiniProg3,可
以编程使用 CY3210 评估板上的 ISSP 插头的器件。清参见
表 6。
图 26. EzI2Cs UM 配置
可将 CY3240 USB-I2C 桥接器 PSoC 开发套件或 MiniProg3
作为 I2C 主设备使用。图 28 显示的是进行测试项目时的
CY3210 评估板。此处使用了 CY3240 I2C-USB 桥接。
表 6. CY3210 评估板的设置情况
CY3210 的连接
PSoC 1
的引脚
依次进行下列操作:将从设备地址设置为 0x04、地址类型
为静态;禁用 ROM 寄存器;将时钟速度设为 400 kHz,快
速模式;并将 P1[0]和 P1[1]作为 I2C 引脚使用。使用 P1[0]
和 P1[1],以便使 CY3210 PSoC 1 评估板上的 ISSP 端口
还可用于连接 I2C 主设备。
说明
P0[0]到
P0[3]
LED1 到 LED4
将 P0[3:0]分别连接至四个 LED
P0[7]
VR
电位器输入
P0[5]
–
连接万用表
–
ISSP 插头(J11)
连接 MiniProg1 或 MiniProg3 以
进行编程
–
ISSP 插头(J11)
连接 Cy3240/MiniProg3,
以通过 I2C 与 PC 进行通信
在固件中,ADC 用于读取 P0.7 上的电压。通过在该引脚上
连接一个电位器,您可以仿真各个不同的电压。ADC 读取
的值会被写入至变量 ADCValue。可用一个主设备读取该
变量。
www.cypress.com
文档编号: 001- 82514 版本*B
20
®
2
PSoC 1 I C 入门
图 28. EzI2Cs 示例项目的测试设置
图 29. 桥接控制面板
指令窗口
状态/响应窗口
可通过以下两种方法测试该项目。您可以使用桥接控制面板
软件,也可以使用外部 MCU。
电源键
使用桥接控制面板软件进行测试
赛普拉斯的桥接控制面板软件可作为图形前端使用,从而同
PSoC I2C 从设备进行通信。它有助于进行测试、调节以及
调试具有 I2C 从设备接口的程序。您可以将桥接控制面板与
PSoC Designer 和 PSoC Programmer™一起安装。
编程该器件后,继续将 CY3240 或 MiniProg3 连接至 ISSP
连接器。CY3240 和 MiniProg3 都使用了 I2C 的 SDA 和
SCL 线所需的上拉电阻。
下面的流程介绍了如何使用桥接控制面板读取 ADC 值并控
制 EzI2Cs_ADC_LED_DAC 项目的 LED 和 DAC 输出。
4.
连接键
为了写入 LED 和 DAC 参数,在 Bridge Control Panel
(桥接控制面板)的指令窗口中,请键入以下指令:
w 04 00 03 80 p
其中,‘w’表示写入指令,‘04’表示从设备地址,
‘00’ 表 示 数值 被 写 入到 的辅 助 地 址内 , ‘03’ 为
LED 的值。数值为‘03’时,LED1 和 LED2 均被打开。
‘80’为 DAC 输出,这时,DAC 的输出大概为 2.09
V。
1.
从 Windows 的启动菜单中打开 Bridge Control Panel。
它位于赛普拉斯文件夹中。
在指令窗口中输入该指令并按下 Enter 键时,I2C 主设
备会将该指令发送给 EzI2Cs 从设备。请观察结果窗口
中 LED 的状态和 P0[5]上的输出。(请参见图 30。)
2.
选 择 器 件 列 表 中 的 MiniProg3 或 CY3240 , 并 点 击
Connect(连接)按键。
w 04+ 00+ 03+ 80+ p
3.
随后,点击 Power(电源)按键,实现为 CY3210 测
试设置供电。(请参见图 29。)
每个字节后面的‘+’符号表示 EzI2Cs 从设备已经确
认了该字节。‘−’ 符号则表示 EzI2Cs 从设备尚未确
认该字节。
例如,尝试输入以下指令:
w 04 00 03 80 55 p
响应为:
w 04+ 00+ 03+ 80+ 55- p
因为已经将 EzI2Cs 寄存器结构中的第三个字节设置为
只读字节,所以从设备不会应答(NAK)对该寄存器
进行的写操作。
www.cypress.com
文档编号: 001- 82514 版本*B
21
®
2
PSoC 1 I C 入门
图 30. 写入 LED 和 DAC 值
该写入指令将设置 EzI2Cs 中的辅助地址。任何其他读
取操作都发生在辅助地址‘0x0’中,该辅助地址中存
有 ADC 值。
然后请键入以下指令,然后选中 Repeat 按键。只观察
读取的 ADC 值。
r 04 x p
图 32. 仅读 ADC 寄存器的值
5.
为了读取 ADC 结果,要在指令窗口中键入以下指令:
r 04 x x x p
其中,‘r’ 表示读取指令,‘04’为从设备地址,
三个‘x’表示读取从设备中的字节数量。
现在,点击桥接控制面板中的 Repeat(重复)按键,
并观察结果窗口中显示的结果。(请参见图 31。)
使用一个外部 MCU 进行测试
图 31. 读取 I2C 寄存器的所有值。
也可以通过将其他微控制器作为 I2C 主设备来测试该项目。
2
本节通过使用被配置为 I C 主设备的 Arduino Duemilanove
2
板来演示 I C 接口,并且假设您已熟悉了 Arduino 原型平台。
有关该板和 Arduino 平台的更多信息,请访问
www.arduino.cc 网站。想要了解如何将 Arduino 板连接到
PC 以及上载该程序的指导信息,请参见 Arduino 入门。
配置 Arduino 器件,使之具有各个专用引脚上(AIN4、
AIN5)的 I2C 主设备接口以及引脚 11 上的 PWM 输出。
将 CY3210 配置为一个 I2C 从设备,该器件具有一个 4 位
数字显示屏(四个 LED)、一个模拟输出(DAC)、一个
模拟输入(已连接到模拟输入引脚的电位器)以及一个
LCD 显示屏。
6.
1.
将示例项目编程到 CY3210 评估板上。
2.
使用 Arduino 软件打开所包含的 Arduino 项目文件
“Arduino_I2C_Master_PSoC1_Slave.ino”。
响应中最后一个字节是 ADC 结果。第二和第三个字节
分别表示 LED 和 DAC 参数的响应值。
3.
在 Tools(工具)选项卡上,请选择“Board”,然后
选择“Arduino Duemilanove”选项。
如果只想读取 ADC 值,不读取 LED 和 DAC 值,(请
参见图 32),首先要执行下面的指令:
4.
从 Tools 选项卡内,选择“Serial Port”(串行端口)
后再选择该板连接上的端口。
5.
使用一个 USB A-B 线缆将程序下载到该板上。编程完
成后,拔掉 USB 线缆。
6.
按照表 7 建立硬件连接。
w 04 02 p
www.cypress.com
文档编号: 001- 82514 版本*B
22
®
2
PSoC 1 I C 入门
表 7. 硬件连接
图 33. Arduino 与 PSoC 连接
Arduino Duemilanove 上的连接
引脚
连接
引脚 11
连接一个 LED
(PWM)
说明
Arduino 上的
PWM 输出
CY3210-PSoC 评估板上的连接
引脚
连接
说明
P00
J5 上的 LED1
数字输出位 0
P01
J5 上的 LED2
数字输出位 1
P02
J5 上的 LED3
数字输出位 2
P03
J5 上的 LED4
数字输出位 3
P05
万用表/示波器
模拟输出(DAC)
P07
J5 上的 VR
模拟输入(ADC)
CY3210 与 Arduino 的连接
Arduino 的
PSoC 1 的引脚
说明
引脚
Analog in 4
2
J7 上的 P10
I C 的 SDA
J7 上的 P11
I C 的 SCL
J5 上的 VCC
使用 Arduino 上的
(模拟输入 4 - A4)
Analog in 5
2
(模拟输入 5 - A5)
5V
5 V 引脚为 PSoC 1
电路板供电
GND
J5 上的 GND
接地
7.
将 CY3217 MiniProg1 或 CY8CKIT-002 MiniProg3 连
接到 CY3210 评估板上的 ISSP 插头。编程完成后,
移除 ISSP 插头上的该编程器。
8.
将 USB 线缆重新连接到 Arduino 板上。这样会同时给
Arduino 板和 CY3210 评估板供电。图 33 展示了设置
的具体情况。
PSoC 读取 P07(已连接到电位器)上的电压,并将该值存
储在 ADCValue 中。Arduino 使用了 I2C 来读取该值,并控
制着引脚 11 上的 PWM 输出。调试 CY3210 板上的电位器
会使 Arduino 板上 LED 的亮度发生变化。
Arduino 通过 I2C 接口连续发送一个 4 位的模块。PSoC 将
读取该值,并将它写到各个 Port0 引脚内,这些引脚已经连
接了四个 LED。Arduino 还会连续发送一个 8 位的数字值,
PSoC DAC 将该值转换为模拟电压。被发送的 DAC 代码是
一个递增值,其取值范围为 0 到 255。图 34 显示的是使用
示波器观察到的 PSoC 引脚(P05)上 DAC 输出的波形。
该示例说明了一个外部 MCU 如何通过使用 I2C 来连接到
PSoC 器件。
www.cypress.com
文档编号: 001- 82514 版本*B
23
®
2
PSoC 1 I C 入门
图 34. P05 上的 DAC 输出波形
测试项目
图 36 显示了项目测试所需的设置。
C
C
V
1
8
0
C
2
C
1
2
3
SDATA
5
SCLK
3
C
C
V
J11
6
ISSP
2
1
5
SDATA
4
SCLK
3
S
E
R
X
0
2
1
8
1
SCL/P1[7]
VSS
P1[6]
1
SDA/P1[5]
1
1
7
1
P1[3]
EXTCLK/P1[4]
S
E
9
1
R
X
4
1
S
E
R
X
SMP
9
P1[2]
1
XtalIn/SCLK/P1[1]
1
XtalOut/SDATA/P1[0]
1
P2[7]
5
VREF/P2[6]
Ext
2
P2[5]
6
AGND/P2[4]
Ext
2
P2[3]
7
P2[2]
2
P2[1]
8
P2[0]
4
5
6
7
P0[7]
1
P0[6]
2
P0[5]
2
P0[4]
2
P0[3]
3
P0[2]
2
P0[1]
4
P0[0]
2
V
2
CY8C29466-24PXI
U
图 36. I2CHW_Slave 项目的原理图
测试该项目时只需要 ISSP 连接。同样可以使用 ISSP 连接
器建立同 I2C 主设备的连接。(请参见表 8。)
I2CHW 从设备示例项目
表 8. 用于测试项目的连接
该项目演示了如何将 I2CHW 配置为从设备。
在该项目中,将写入到 I2CHW 从设备的数据回送给主设备。
将读取与写入缓冲区配置为同一缓冲区,即可实现该操作。
具体操作,请使用下面的 API:
/*When master writes data it will write to
rxtxBuffer*/ I2CHW_1_InitWrite(rxtxBuffer,
10);
/*When master reads data it will read from
rxtxBuffer*/
I2CHW_1_InitRamRead(rxtxBuffer, 10);
主代码检查主设备是否已经对 I2CHW 从设备进行读/写操作。
如果进行了该操作,代码将重置缓冲区,并清除相应的状态
标志。
PSoC 1
的引脚
CY3210 的连接
说明
–
ISSP 插头(J11)
用于进行编程的 MiniProg1 或
MiniProg3 连接
–
ISSP 插头(J11)
连接 Cy3240 或 MiniProg3,以
2
通过 I C 与 PC 进行通信。
通过使用 CY3210 PSoC 1 评估板,可以测试 I2CHW 从设
备项目。
通过 CY3210 评估板上的 ISSP 插头,可以使用 CY3217
MiniProg1 或 CY8CKIT-002 MiniProg3 编程器件。
2
2
图 35 显示了 I2CHW UM 的配置情况。器件的从设备地址为
0x04。
将 CY3240 USB-I C 桥接器或 MiniProg3 作为 I C 主设备
使用。
图 35. I2CHW UM 从设备的配置
图 37 显示的是如何使用桥接控制面板对 I2CHW 从设备进
行读/写操作。欲了解设置桥接控制面板的简要说明,请参
见 EzI2Cs_ADC_LED_DAC 示例项目。
1.
在桥接控制面板的指令窗口中,请键入以下指令:
w 04 00 01 02 03 04 05 06 07 08 09 p
r 04 x x x x x x x x x x p
w 04 0a 0b 0c 0d 0e 0f 10 11 12 13
r 04 x x x x x x x x x x p
2.
选择“Send all strings”(发送所有字符串)选项,然
后点击“Send”按键,实现依次执行所有指令。
将在结果窗口中观察到:执行读指令时,使用写指令写入的
相同值均被回读。
www.cypress.com
文档编号: 001- 82514 版本*B
24
®
2
PSoC 1 I C 入门
图 37. I2CHW 从设备的写入和读取操作
从设备生成 ACK 时,主设备退出“while”循环。
接下来,主设备将读取刚刚写入到 EEPROM 中的数据。为
了完成上述操作,首先要写入两个辅助地址字节,然后从
EEPROM 中读取 64 字节的数据。随后,主设备会将被读
取的数据与被写入的数据进行比较。如果所有 64 个字节均
匹配,LED 灯将亮起。
为了测试该项目,需要将 P1.5 和 P1.7 分别连接到外部 I2C
EEPROM 的 SDA 和 SCL 线路。请确保在这些线路上已经
安装了外部上 拉电阻。将带 有串行电阻的 LED 连接 至
P0_7。可以使用一个 CY3210 PSoC 评估板测试该项目。
(请参见表 9。)
表 9. 用于测试项目的连接
PSoC 1
的引脚
P1[5]
2
I CHW 主设备示例项目
该项目演示了如何在主设备模式下使用 I2CHW UM。并且
它还专门演示了如何使用 I2CHW UM 对外部 I2C EEPROM
进行读/写操作。
图 38 显示了 I2CHW UM 的配置情况。
P1[7]
P0[7]
CY3210 的连接
2.2 kΩ 的电阻
被上拉到 VDD
2.2 kΩ 的电阻
被上拉到 VDD
LED1
说明
连接到 24C256 IC 的 SDA
连接到 24C256 IC 的 SCL
LED 指示灯
图 39 显示了项目测试所需的设置
2
图 38. I CHW 主设备的配置
图 39. I2CHW_Master 测试原理图
在主代码中,I2CHW UM 被初始化。然后,它从
RAMBuffer 阵列中将 66 个字节写入到 EEPROM 内。前两
个字节表示写入到 EEPROM 中的数据所在的辅助地址。该
项目将使用页面大小为 64 个字节的 32 Kb EEPROM 进行
测试。当写入到一个更小的 EEPROM 时,写入值被限制为
特定 EEPROM 的页面大小。
向 EEPROM 中写入数据时,EEPROM 会进入一个写周期。
在此期间,从设备不会对任何 I2C 数据操作生成 ACK。只
有 EEPROM 完成该写周期后,才能执行下一步操作。为了
进行检测,主设备会进入“while”循环,持续发送“启动”
指令并检查 ACK 状态。
while(!(I2CHW_fSendStart(0x50,
I2CHW_READ)))
{
I2CHW_SendStop();
}
www.cypress.com
文档编号: 001- 82514 版本*B
25
®
2
PSoC 1 I C 入门
图 40. 移植项目
移植示例项目
利用 PSoC Designer 的内置复制功能,可轻松将这些项目
移植到其他器件中。例如,要想移植
EzI2Cs_ADC_LED_DAC 项目,请执行下面操作:
1.
打开 PSoC Designer,创建一个新项目。
2.
在 Project Creation(项目创建)参数中,选择 Clone
(复制)项。
3.
在“Clone from Project”(从项目中复制)参数中,
浏览到 EzI2Cs_ADC_LED_DAC 项目的项目文件夹,
然后选择 EzI2Cs_ADC_LED_DAC.cmx 文件。接着,
点击 Device Catalog(器件目录)按键,选择要运行
的器件。
4.
选择器件后,请点击 OK;PSoC Designer 会将该项目
移植到新的器件内。(请参见图 40。)
www.cypress.com
文档编号: 001- 82514 版本*B
26
®
2
PSoC 1 I C 入门
文档修订记录
文档标题:PSoC® 1 I2C 入门 — AN50987
文档编号:001-82514
版本
ECN
变更者
提交日期
**
3732096
QDGU
09/03/2012
本文档版本号为 Rev**,译自英文版 001-50987 Rev*C。
*A
4592688
QDGU
12/09/2014
本文档版本号为 Rev*A,译自英文版 001-50987 Rev*D。
*B
4992976
RING
11/02/2015
本文档版本号为 Rev*B,译自英文版 001-50987 Rev*E。
www.cypress.com
变更说明
文档编号: 001- 82514 版本*B
27
®
2
PSoC 1 I C 入门
全球销售和设计支持
赛普拉斯公司拥有一个由办事处、解决方案中心、厂商代表和经销商组成的全球性网络。如果想要查找离您最近的办事处,请访
问赛普拉斯所在地。
PSoC®解决方案
产品
汽车级
cypress.com/go/automotive
psoc.cypress.com/solutions
时钟与缓冲器
cypress.com/go/clocks
PSoC 1 | PSoC 3 | PSoC 4 | PSoC 5LP
接口
cypress.com/go/interface
赛普拉斯开发者社区
照明和电源控制
cypress.com/go/powerpsoc
cypress.com/go/plc
存储器
cypress.com/go/memory
PSoC
cypress.com/go/psoc
触摸感应
cypress.com/go/touch
USB 控制器
cypress.com/go/usb
无线/射频
cypress.com/go/wireless
社区 | 论坛| 博客 | 视频 | 培训
技术支持
cypress.com/go/support
PSoC 和 CapSense 是赛普拉斯半导体公司的注册商标且 PSoC Designer 是赛普拉斯半导体公司的商标。此处引用的所有商标或注册商标归其各自所有
者所有。
赛普拉斯半导体
198 Champion Court
San Jose, CA 95134-1709
电话
:408-943-2600
传真
:408-943-4730
网站地址 :www.cypress.com
©赛普拉斯半导体公司,2009-2015。此处所包含的信息可能会随时更改,恕不另行通知。除赛普拉斯产品内嵌的电路以外,赛普拉斯半导体公司不对任
何其他电路的使用承担任何责任。也不会以明示或暗示的方式授予任何专利许可或其他权利。除非与赛普拉斯签订明确的书面协议,否则赛普拉斯不保证
产品能够用于或适用于医疗、生命支持、救生、关键控制或安全应用领域。此外,对于可能发生运转异常和故障并对用户造成严重伤害的生命支持系统,
赛普拉斯不授权将其产品用作此类系统的关键组件。若将赛普拉斯产品用于生命支持系统中,则表示制造商将承担因此类使用而招致的所有风险,并确保
赛普拉斯免于因此而受到任何指控。
该源代码(软件和/或固件)均归赛普拉斯半导体公司(赛普拉斯)所有,并受全球专利法规(美国和美国以外的专利法规)、美国版权法以及国际条约
规定的保护和约束。赛普拉斯据此向获许可者授予适用于个人的、非独占性、不可转让的许可,用以复制、使用、修改、创建赛普拉斯源代码的派生作品、
编译赛普拉斯源代码和派生作品,并且其目的只能是创建自定义软件和/或固件,以支持获许可者仅将其获得的产品依照适用协议规定的方式与赛普拉斯
集成电路配合使用。除上述指定的用途外,未经赛普拉斯明确的书面许可,不得对此类源代码进行任何复制、修改、转换、编译或演示。
免责声明:赛普拉斯不针对此材料提供任何类型的明示或暗示保证,包括(但不仅限于)针对特定用途的适销性和适用性的暗示保证。赛普拉斯保留在不
做出通知的情况下对此处所述材料进行更改的权利。赛普拉斯不对此处所述之任何产品或电路的应用或使用承担任何责任。对于合理预计可能发生运转异
常和故障,并对用户造成严重伤害的生命支持系统,赛普拉斯不授权将其产品用作此类系统的关键组件。若将赛普拉斯产品用于生命支持系统中,则表示
制造商将承担因此类使用而招致的所有风险,并确保赛普拉斯免于因此而受到任何指控。
产品使用可能受适用于赛普拉斯软件许可协议的限制。
www.cypress.com
文档编号: 001- 82514 版本*B
28