DSP 2803x IIC/I2C总线

参考手册:TMS320x2803x, Piccolo Technical Reference Manual.pdf

IIC总线:

概念

IIC总线(Inter IC BUS)由 PHILIPS 公司推出。IIC 总线由数据线 SDA 和时钟线 SCL 两条线构成通信电路,连接到总线的器件既可以发送数据,也可以接收数据,每个器件都用唯一的地址标志。

IIC/I2C 总线术语的定义

术语
描述
发送器
发送数据到总线的器件
接收器
从总线接收数据的器件
主机
初始化发送、产生时钟信号和终止发送的器件
从机
被主机寻址的器件
多主机
同时有多于一个主机尝试控制总线,但不破坏报文
仲裁
是一个在有多个主机同时尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程
同步
两个或多个器件同步时钟信号的过程
特征

1.兼容飞利浦半导体 I2C 总线规范(2.1版)

支持8位格式数据传送
7位和10位的寻址模式
启动字节模式
通用拨叫功能
支持多个主发送器和从接收器
支持多个从发送器和主接收器
具有主发送/接收和接收/发送模式
串行的8位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,IIC还有高速模式,但DSP2803x的IIC模块不支持高速模式

2. 一个

DSP 2803x  IIC/I2C总线
多个 I2C 模块连接示意图

时钟

I2C 模块时钟经I2C输入时钟 SYSCLK 分频得到,通过配置分频器寄存器计算方式如图中公式所示,为与所有 I2C 协议时钟频率匹配,其模块时钟必须限制在 7-12 MHz,SCL引脚上的主时钟基于 I2C 模块时钟分频得到,计算公式如图所示,I2CCLKL 寄存器中的 ICCL和 I2CCLKH ICCH 位分别代表分频值的低字节部分和高字节部分。

 

DSP 2803x  IIC/I2C总线
DSP 2803x IIC时钟

DSP 2803x  IIC/I2C总线

DSP 2803x  IIC/I2C总线
I2CPSC 配置分频器寄存器

操作模式

操作模式

描述
从接收器模式
I2C 模块作为从机,接收主机发送的数据
从发送器模式
I2C 模块作为从机,发送数据给主机
主接收器模式
I2C 模块作为主机,接收从机发送的数据
主发送器模式
I2C 模块作为主机,发送控制信息和数据给从机
I2C 模块的起始和停止条件 

DSP 2803x  IIC/I2C总线
起止条件

 当 IIC 总线上的 IIC 模块被配置成主机时,可由该模块产生起始和停止条件。

起始条件:SCL 时钟线为高电平,SDA 数据线产生由高到低的跳变时,表示起始,主机通过起始条件表明数据传送开始;
停止条件,SCL 时钟线为低电平,SDA 数据线产生由低到高的跳变时,表示停止,主机通过停止条件表明数据传送结束。
串行数据格式

DSP 2803x  IIC/I2C总线
IIC 模块数据传输格式(8位数据的7位寻址结构)

 如上图所示位 IIC 传输数据的例子。IIC 模块支持传输 1 – 8 位的数据值,图中传送的数据是8位。SDA 数据线上每一位的维持时间相当于SCL的一个脉冲。传输数据时,总是高有效位字节(MSB)开始传送。发送和接收数据的个数没有限制。

1. 7位寻址格式【Reset后的默认格式】

选择方法:禁止扩展地址使能位,关闭自由数据格式【I2CMDR.XA = 0 ;I2CMDR.FDF = 0】

如下图所示的7位地址格式中,起始位后的第一个字节包括 7 位的从机地址和 1 位读写选择位。位决定数据传送的方向:

R/W = 0:主机向所寻址的从机发送数据;
R/W = 1:主机读取来自从机的数据。

每个字节传输完成后必须插入额外的一个时钟周期应答位(ACK)。若在从机传送第一个字节后,从机产生应答位,则发送器就会发送 n 位数据。 n 是由 I2CMDR 的 BC 位来确定的 1 到 8 位的数。数据发送完成后,接收器产生一个应答位 ACK。

DSP 2803x  IIC/I2C总线
IIC 模块 7 位寻址格式(FDF = 0,XA = 0)

2. 10位寻址格式

选择方法:使能扩展地址使能位,关闭自由数据格式【I2CMDR.XA = 1 ;I2CMDR.FDF = 0】

如下图所示的10位地址格式,类似于 7 位地址格式,但主机通过两个单独字节的传送来发送从机地址。第一个字节包括 11110b、10 位从机地址的两个最高位 MSBs 以及一个读写选择位。第二个字节为 10 位从机地址剩下的 8 位地址。主机一旦向从机发送了第二个字节,就可以写数据,或者通过重复使用开始位(START)来改变数据传送方向。

DSP 2803x  IIC/I2C总线
IIC 模块 10 位寻址格式(FDF = 0,XA = 1)

3 自由数据格式【当 I2CMDR.DLB = 1 时,不支持自由数据格式】

选择方法:向自由数据格式位(FDF)写1【I2CMDR.FDF = 1】

起始位后的第一个字节位数据字节,每个数据字节后插入一个应答位ACK,数据位的长度可位 1 – 8 位(取决于 I2CMDR 中的 BC 位),此格式下不发送地址位和数据方向位。因此,发送器和接收器必须同时支持自由数据格式,并且在整个传输过程中数据的传输方向保持不变。

DSP 2803x  IIC/I2C总线
自由数据格式(FDF = 1)

4 使用重复起始位

 每个数据字节传输结束后,主机可以再次驱动一个起始信号。使用该功能,主机可以与多个从机通信,二不需要通过驱动停止信号来放弃总线控制权。

DSP 2803x  IIC/I2C总线
重复起始位操作(7位寻址模式)

5 应答位(ACK)

在 IIC 总线传输过程中,主机每发送一个字节,从机都应该产生一个额外的应答(ACK)或非应答(NACK)信号。

应答信号的产生方式:

当主机完成一个字节数据后在 SCL 低电平期间释放 SDA 数据总线,若没有从机作用,SDA 将被上拉至高电平。此时从机若要发出应答信号就应该在 SCL 时钟线低电平期间将 SDA 数据总线拉低,主机检测到这个低电平即表示从机做出了应答。

DSP 2803x  IIC/I2C总线
一次 7 位地址模式传输的时序图

6 非应答位(NACK)

 如果从机不想做出应答或总线出错,当主机释放 SDA 数据总线后没有从机 SDA 拉低,即表示产生一个非应答(NACK)信号。

非应答信号的主要用处有:

工作在主收模式时,主机接收一定字节的数据后可向从机发送一个非应答(NACK)信号告诉从机不需要再发送新的数据;

工作再主发模式工作时,有一个非应答(NACK)中断可用于主句对NACK位进行处理。

DSP 2803x  IIC/I2C总线
当产生 NACK 响应的时序图

上图为一实例:

寻址地址为 0x55 的从机但此从机并不存在,那么主机发送的第一个地址字节后将会释放 SDA 总线,但又没从机拉低 SDA 数据总线,因此产生了一个非应答(NACK)相应。

从时序图可看出,当主机检测到非应答响应时将 SCL 时钟总线拉低,以将阻塞其他设备的操作,所以此时需要进入 NACK 中断进行处理,在中断处理程序中可通过 IRS 位清零从而复位 I2CSTR 状态寄存器,实现 IIC 模块的复位。

时钟同步

SCL 的“线与”特性即是指在 SCL 上首先产生低电平的设备将会控制其他设备。这个下降沿强制其他设备的时钟发生器开始其低电平周期。并且只要有设备的时钟信号为低,则 SCL 一直保持为低,必须等 SCL 被释放后其他设备才能结束它们的低电平周期,开始其高电平周期。SCL 上产生的同步信号中,低电平周期的长度由最慢的设备巨顶,高电平周期的长度由最快的设备决定。

DSP 2803x  IIC/I2C总线
时钟同步时序图

仲裁

若同时有两个或更多主发送器试图在同一时刻、同一总线上发送数据,则需启动仲裁程序。

当第一个主发送器将 SDA数据线置高时(视作释放 SDA),数据线就会被另一个置 SDA 为低的主发送器所控制。仲裁机制总是将优先权赋予那些发送的数据在二进制形式中值最小的设备。因此,当两个或更多的设备发送相同的首字节,仲裁机制会继续根据随后的字节进行仲裁。

DSP 2803x  IIC/I2C总线
两设备间的仲裁过程

I2C模块的中断请求

基本中断请求

基本 I2C 中断请求

中断请求
中断描述
XRDYINT
发送寄存器就绪中断:由于先前的数据已从数据发送寄存器 I2CDXR 转移到发送移位寄存器 I2CXSR 中,数据发送寄存器 I2CDXR 准备好接收新的数据。
RRDYINT
接收寄存器就绪中断:作为接收器时,接收到的新数据已经从接收移位寄存器 I2CRSR 中转存至数据接收寄存器 I2CDRR 中,通过 RRDY_INT 通知 CPU 数据准备好被读取。
ARDYINT
寄存器访问就绪中断:由于先前编程的地址、数据以及命令值已经被使用,I2C 模块寄存器准备好被访问。
NACKINT
非应答条件中断:I2C 模块被配置为主发送机时,当从接收机没有发送应答信号时,主机产生一个非应答信号中断。
ARBLINT
仲裁丢失中断:I2C 模块失去和其他主发送机的仲裁竞争。
SCDINT
检测到停止条件中断:在 I2C 总线上检测到停止条件。
AASINT
被寻址中断:在 I2C 总线上的其他主设备把 I2C 配置为从设备。

注意:

当 I2C 模块处于 FIFO 模式时,I2C 基本中断请求中的发送数据寄存器就绪(XRDYINT)和接收数据寄存器就绪(RRDYINT)不应该被使用,而应该使用 FIFO 中断;
所有的 I2C 基本中断请求都可以使用 轮询 I2CSTR 中的相应状态位的方法进行操作。

DSP 2803x  IIC/I2C总线
IIC 基本中断请求功能示意图

FIFO模式中断

除了以上七个基本中断,在 FIFO 模式中,发送和接收 FIFO 队列各有一个 FIFO 模式中断。

接收 FIFO 可配置成在接收一定字节数后生成一个 FIFO 接收中断请求,f2803x 系列最高能达4个字节;
发送 FIFO 可配置成在发送一定字节数后生成一个 FIFO 发送中断请求,f2803x 系列最高能达4个字节。

这两个 FIFO 中断源集成在一个可屏蔽的 PIE 中断(IC2INT2A)中,中断服务程序可以通过读取 FIFO 状态寄存器来确定中断源。

DSP 2803x  IIC/I2C总线
IIC FIFO 中断

禁用或复位 IIC 模块

两种方式:

向 I2CMDR 寄存器中的 IIC 重置位(IRS)写 0 。此方式会将 I2CSTR 中的所有状态位复位至默认状态,同时 IIC 模块会保持禁能,直到  IRS 变为 1 。此时 SDA 数据线和 SCL 时钟线 处于高阻态。

将 CPU 管脚 XRS 脚置 0 ,初始化 DSP 复位,整个 DSP 一直保持复位直至 XRS 脚被拉高。当 XRS 被释放为高电平时,所有的 IIC 模块寄存器被复位至默认值,IRS 位被强制置 0 ,使得 IIC 模块复位,IIC 模块将保持复位直至对 IRS 写 1 。

当配置或重新配置 IIC 模块时,IRS 位必须为 0 。强制 IRS 为 0 还能用来节省CPU耗能和清除错误情况。

 

IIC 模块寄存器

如下表所示为 IIC 模块使用的寄存器列表,除了发送移位寄存器( I2CXSR)和接收移位寄存器(I2CRSR)外,所有的寄存器都直接与CPU连接,用户可直接访问。

IIC 模块寄存器表

序号
寄存器名
地址
描述
1
I2COAR
0x7900
I2C 模块自身地址寄存器
2
I2CIER
0x7901
I2C 模块中断使能寄存器
3
I2CSTR
0x7902
I2C 模块状态寄存器
4
I2CCLKL
0x7903
I2C 模块低电平时钟分频值寄存器(控制低电平持续时间)
5
I2CCLKH
0x7904
I2C 模块高电平时钟分频值寄存器(控制高电平持续时间)
6
I2CCNT
0x7905
数据计数器寄存器(对输出字节进行计数)
7
I2CDRR
0x7906
I2C 模块数据接收寄存器( I2C 从总线上接收到一个字节数据后,数据将从 I2CRSR 中转移至 I2CDRR,供 CPU 读取)
8
I2CSAR
0x7907
I2C 模块从地址寄存器
9
I2CDXR
0x7908
I2C 模块数据发送寄存器(数据写入 I2CDXR 后将从转移至 I2CXSR,并逐次转移到 SDA 总线上)
10
I2CMDR
0x7909
I2C 模块模式寄存器
11
I2CISRC
0x790A
I2C 模块中断源寄存器(用于查询确切的中断源)
12
I2CEMDR
0x790B
I2C 模块扩展模式寄存器
13
I2CPSC
0x790C
I2C 模块预分频寄存器( 对 SYSCLKOUT 分频输出到 I2C 模块作为I2C 模块的工作时钟)
14
I2CFFTX
0x7920
I2C 模块 FIFO 模式下的发送寄存器
15
I2CFFRX
0x7921
I2C 模块 FIFO 模式下的接收寄存器

注意:IIC 模块的时钟来源由时钟控制寄存器 PCLKCR0 控制,在使用 IIC 模块前需确认 PCLKCR0 中的 IIC 模块的时钟控制位已置1

IIC 中断源寄存器:

每次发生 IIC 中断请求时, INTCODE 域会生成一个中断源特征码,通过读取 INTCODE 的值可确定确切的中断源。当 CPU 读取这个寄存器后,该寄存器将被清除,同时还会发生以下事件:

中断状态寄存器(I2CSTR)相应的中断源被清除,除 ARDY,RRD 以及 XRDY 位外。在相应的位写1,该位被清除;
仲裁器将会再次处理保留在中断请求队列中的中断请求,仲裁器将会将中断请求队列中具有最高优先级的中断请求发送至 CPU 产生中断,同时向 IIC 中断源寄存器(I2CISRC)写入该中断请求的特征码。

// I2C interrupt vector register bit definitions */
struct I2CISRC_BITS { // bits description
Uint16 INTCODE:3; // 2:0 Interrupt code
Uint16 rsvd1:13; // 15:3 reserved
};

union I2CISRC_REG {
Uint16 all;
struct I2CISRC_BITS bit;
};

IIC 中断使能寄存器:

0:禁能;
1:使能。

// I2C interrupt mask register bit definitions */
struct I2CIER_BITS { // bits description
Uint16 ARBL:1; // 0 Arbitration lost interrupt
Uint16 NACK:1; // 1 No ack interrupt
Uint16 ARDY:1; // 2 Register access ready interrupt
Uint16 RRDY:1; // 3 Recieve data ready interrupt
Uint16 XRDY:1; // 4 Transmit data ready interrupt
Uint16 SCD:1; // 5 Stop condition detection
Uint16 AAS:1; // 6 Address as slave
Uint16 rsvd:9; // 15:7 reserved
};

union I2CIER_REG {
Uint16 all;
struct I2CIER_BITS bit;
};

IIC 状态寄存器:

用于确定发生了哪个中断并读取状态信息。

// I2C status register bit definitions */
struct I2CSTR_BITS { // bits description
Uint16 ARBL:1; // 0 Arbitration lost interrupt
Uint16 NACK:1; // 1 No ack interrupt
Uint16 ARDY:1; // 2 Register access ready interrupt
Uint16 RRDY:1; // 3 Recieve data ready interrupt
Uint16 XRDY:1; // 4 Transmit data ready interrupt
Uint16 SCD:1; // 5 Stop condition detection
Uint16 rsvd1:2; // 7:6 reserved
Uint16 AD0:1; // 8 Address Zero
Uint16 AAS:1; // 9 Address as slave
Uint16 XSMT:1; // 10 XMIT shift empty
Uint16 RSFULL:1; // 11 Recieve shift full
Uint16 BB:1; // 12 Bus busy
Uint16 NACKSNT:1; // 13 A no ack sent
Uint16 SDIR:1; // 14 Slave direction
Uint16 rsvd2:1; // 15 reserved
};

union I2CSTR_REG {
Uint16 all;
struct I2CSTR_BITS bit;
};

IIC 模式控制寄存器:

其中 BC 位可以控制 IIC 模块的数据位格式

// I2C mode control register bit definitions */
struct I2CMDR_BITS { // bits description
Uint16 BC:3; // 2:0 Bit count
Uint16 FDF:1; // 3 Free data format
Uint16 STB:1; // 4 Start byte
Uint16 IRS:1; // 5 I2C Reset not
Uint16 DLB:1; // 6 Digital loopback
Uint16 RM:1; // 7 Repeat mode
Uint16 XA:1; // 8 Expand address
Uint16 TRX:1; // 9 Transmitter/reciever
Uint16 MST:1; // 10 Master/slave
Uint16 STP:1; // 11 Stop condition
Uint16 rsvd1:1; // 12 reserved
Uint16 STT:1; // 13 Start condition
Uint16 FREE:1; // 14 Emulation mode
Uint16 NACKMOD:1; // 15 No Ack mode
};

union I2CMDR_REG {
Uint16 all;
struct I2CMDR_BITS bit;
};

IIC 扩展模式寄存器:

// I2C extended mode control register bit definitions */
struct I2CEMDR_BITS { // bits description
Uint16 BCM:1; // 0 Bit count
Uint16 rsvd1:15; // 15:1 reserved
};

union I2CEMDR_REG {
Uint16 all;
struct I2CEMDR_BITS bit;
};

IIC 时钟预分频寄存器:

// I2C pre-scaler register bit definitions */
struct I2CPSC_BITS { // bits description
Uint16 IPSC:8; // 7:0 pre-scaler
Uint16 rsvd1:8; // 15:8 reserved
};

union I2CPSC_REG {
Uint16 all;
struct I2CPSC_BITS bit;
};

FIFO 发送和接收寄存器:

// TX FIFO control register bit definitions */
struct I2CFFTX_BITS { // bits description
Uint16 TXFFIL:5; // 4:0 FIFO interrupt level
Uint16 TXFFIENA:1; // 5 FIFO interrupt enable/disable
Uint16 TXFFINTCLR:1; // 6 FIFO clear
Uint16 TXFFINT:1; // 7 FIFO interrupt flag
Uint16 TXFFST:5; // 12:8 FIFO level status
Uint16 TXFFRST:1; // 13 FIFO reset
Uint16 I2CFFEN:1; // 14 enable/disable TX & RX FIFOs
Uint16 rsvd1:1; // 15 reserved

};

union I2CFFTX_REG {
Uint16 all;
struct I2CFFTX_BITS bit;
};

//----------------------------------------------------
// RX FIFO control register bit definitions */
struct I2CFFRX_BITS { // bits description
Uint16 RXFFIL:5; // 4:0 FIFO interrupt level
Uint16 RXFFIENA:1; // 5 FIFO interrupt enable/disable
Uint16 RXFFINTCLR:1; // 6 FIFO clear
Uint16 RXFFINT:1; // 7 FIFO interrupt flag
Uint16 RXFFST:5; // 12:8 FIFO level
Uint16 RXFFRST:1; // 13 FIFO reset
Uint16 rsvd1:2; // 15:14 reserved
};

union I2CFFRX_REG {
Uint16 all;
struct I2CFFRX_BITS bit;
};

原创:https://www.panoramacn.com
源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

DSP 2803x  IIC/I2C总线

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
未经允许不得转载:书荒源码源码网每日更新网站源码模板! » DSP 2803x IIC/I2C总线
关注我们小说电影免费看
关注我们,获取更多的全网素材资源,有趣有料!
120000+人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

您的打赏就是我分享的动力!

支付宝扫一扫打赏

微信扫一扫打赏