DSP2808中i2c实例分析
- 格式:docx
- 大小:516.62 KB
- 文档页数:17
DSP I2C 应用说明1.示例程序中几种状态第一次看i2c_eeprom示例程序,对程序中的MsgStatus信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。
先把程序中的头文件涉及的7种状态分析一下。
// I2C Message Commands for I2CMSG struct#define I2C_MSGSTAT_INACTIVE 0x0000 //未激活状态:一般成功发送数据或者//接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。
#define I2C_MSGSTAT_SEND_WITHSTOP 0x0010 //发送带停止位数据:这是为写数据而设///的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。
#define I2C_MSGSTAT_WRITE_BUSY 0x0011 //写数据忙状态:在将待写的数据放入//缓存后,就可以使能IIC传输数据了,然后把信息状态设为该状态,意在告诉用户:数据//已经在传送过程中。
当然是否传送完毕,还需要通过查询SCD位来判断。
#define I2C_MSGSTAT_SEND_NOSTOP 0x0020//发送无停止位数据:这个状态是为了读//取数据而设的,有查阅过AT24C1024EEPROM存储器使用手册的读者知道,在读数据之前//要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。
设为这个状//态意在告诉读者,可以发送要读取的数据的地址了。
#define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0x0021//发送无停止位数据忙状态:这个状态是//为了读取数据而设的,似于I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。
//传送是否成功,还要看ARDY的状态。
#define I2C_MSGSTAT_RESTART 0x0022//重发开始位状态:这个状态也是为读取////数据而设。
I2C总线原理及应用实例I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。
例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。
可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
1 I2C总线特点I2C总线最主要的优点是其简单性和有效性。
由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。
总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。
一个主控能够控制信号的传输和时钟频率。
当然,在任何时间点上只能有一个主控。
2 I2C总线工作原理2.1 总线的构成及信号类型I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。
各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
DSP I2C 应用说明1.示例程序中几种状态第一次看i2c_eeprom示例程序,对程序中的MsgStatus信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。
先把程序中的头文件涉及的7种状态分析一下。
// I2C Message Commands for I2CMSG struct#define I2C_MSGSTAT_INACTIVE 0x0000//未激活状态:一般成功发送数据或者//接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。
#define I2C_MSGSTAT_SEND_WITHSTOP 0x0010 //发送带停止位数据:这是为写数据而设///的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。
#define I2C_MSGSTAT_WRITE_BUSY 0x0011 //写数据忙状态:在将待写的数据放入//缓存后,就可以使能IIC传输数据了,然后把信息状态设为该状态,意在告诉用户:数据//已经在传送过程中。
当然是否传送完毕,还需要通过查询SCD位来判断。
#define I2C_MSGSTAT_SEND_NOSTOP 0x0020//发送无停止位数据:这个状态是为了读//取数据而设的,有查阅过AT24C1024EEPROM存储器使用手册的读者知道,在读数据之前//要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。
设为这个状//态意在告诉读者,可以发送要读取的数据的地址了。
#define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0x0021//发送无停止位数据忙状态:这个状态是//为了读取数据而设的,似于I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。
//传送是否成功,还要看ARDY的状态。
#define I2C_MSGSTAT_RESTART 0x0022//重发开始位状态:这个状态也是为读取////数据而设。
I2C总线原理及应用实例I2C总线是一种串行通信总线,全称为Inter-Integrated Circuit,是Philips(飞利浦)公司在1982年推出的一种通信协议。
它可以用于连接各种集成电路(Integrated Circuits,ICs),如处理器、传感器、存储器等。
I2C总线的原理是基于主从架构。
主设备(Master)负责生成时钟信号,并发送和接收数据,从设备(Slave)通过地址识别和响应主设备的命令。
I2C总线使用两根线来传输数据,一根是时钟线(SCL),用于主设备生成的时钟信号;另一根是数据线(SDA),用于双向传输数据。
1. 主设备发送起始位(Start)信号,将SDA线从高电平拉低;然后通过SCL线发送时钟信号,用于同步通信。
2.主设备发送从设备的地址,从设备通过地址识别确定是否响应。
3.主设备发送要传输的数据到从设备,从设备响应确认信号。
4. 主设备可以继续发送数据,或者发送停止位(Stop)信号结束通信。
停止位是将SDA线从低电平拉高。
1.温度监测器:I2C总线可以连接到温度传感器上,通过读取传感器的输出数据,进行温度的监测和控制。
主设备可以设置警报阈值,当温度超过阈值时,可以触发相应的措施。
2.显示屏:很多智能设备上的显示屏都采用了I2C总线,如液晶显示屏(LCD)或有机发光二极管(OLED)等。
主设备通过I2C总线发送要显示的信息,并控制显示效果,如亮度、对比度、清晰度等参数。
3.扩展存储器:I2C总线可以用于连接外部存储器,如电子存储器(EEPROM)。
通过I2C总线,可以读取和写入存储器中的数据,实现数据的存储和传输。
4.触摸屏控制器:许多触摸屏控制器也使用了I2C总线,主要用于将触摸信号传输给主设备,并接收主设备的命令。
通过I2C总线,可以实现对触摸屏的操作,如单击、滑动、缩放等。
5.电源管理器:一些电源管理器也采用了I2C总线,用于控制和监测电池电量、充电状态、电压、电流等参数。
基于TMS320F2808 DSP 最小系统设计及应用TMS320F2808 是德州仪器(TI)公司推出的C2000 平台上的定点DSP 芯片,具有低成本、低功耗和高性能处理能力,特别适用于大量数据处理的测控领域和复杂运算的电机控制领域。
本文在介绍TMS320F2808 的性能基础上设计了以TMS320F2808 DSP 为核心的最小应用系统,并给出了各部分具体硬件电路的设计和典型扩展应用。
1 TMS320F2808 特点TMS320F2808 是美国TI 公司推出的C2000 平台上的32 位定点DSP 芯片,具有低成本、低功耗和高性能处理能力,外设功能增强且极具价格优势,采用100 引脚封装,所有产品引脚兼容,具有高达64 kB 的闪存和100MIPS 的性能。
片上集成了丰富而又先进的增强型外设,如16 路PWM 输出通道、6 路HRPWM 输出通道、4 个eCAP 输入接口、6 个32 位/16 位定时器;串行外没模块,如4 个SPI 模块、2 个SCI 模块、2 个CAN 模块、1 个I2C 模块;12 位16 通道的A/D 转换器;35 个可独立编程复用的通用I/O 引脚(GPIO),其输入引脚具有窄脉冲限定器。
使其具有强大的数字信号处理能力,又具有强大的事件管理能力和嵌入式控制功能,非常适用于工业、汽车、医疗和消费类市场中的数字电机控制、数字电源和高级感应技术。
2 TMS320F2808 最小系统结构DSP 最小系统由DSP 芯片及其基本的外围电路和接口组成,如果去掉其中的任何一部分,都无法成为一个独立的DSP系统工作。
最小系统通常包括DSP 芯片、电源变换电路、JTAG 仿真接口、复位电路、引导模式电路等。
3 硬件电路设计3.1 电源电路及复位电路TMS320F2808 是一个低功耗芯片,内核电源电压为1.8 V,芯片与外部接口间采用3.3 V 电源电压,考虑到硬件系统要求电源具有稳定功能和纹波小的特点,另外也考虑到硬件系统的功耗等特点,因此本设计中采用TI 公司的的TPS70151 电源芯片。
1I2C寄存器1.1.1I2C模式寄存器——I2CMDR16位寄存器,包含了I2C模块的控制部分I2C作为主机时,RM、STT、STP位于总线发送/接收数据格式和总线状态关系表1.1.2I2C中断使能寄存器——I2CIER包括I2C中断的使能与屏蔽位;1.1.3I2C状态寄存器——I2CSTR包括中断标志状态和读状态信息;1.1.4I2C中断源寄存器——I2CSRC该寄存器主要表明是哪个中断源触发了I2C中断;1.1.5I2C时钟分频寄存器——I2CPSC用于设置I2C输入时钟的分频系数,I2C模块复位时必须初始化I2CPSC;1.1.6I2C时钟宽度寄存器——I2CCLKL、I2CCLKH该寄存器决定I2C时钟的高低电平持续时间I2CCLKL 中的ICCL。
ICCL 决定了时钟信号的低电平时间。
I2CCLKH 中的ICCH。
ICCH 决定了时钟信号的高电平时间。
主机时钟宽度计算公式:T mst=T mod∗((ICCL+d)+(ICCH+d))T mst=(IPSC+1)∗((ICCL+d)+(ICCH+d))I2C输入时钟频率其中T mod为I2C模块的时钟电平宽度,及时钟周期,d的值由IPSC决定。
1.1.7I2C从机地址寄存器——I2CSARI2C模块从机地址寄存器,当I2C模块作为主机时,该寄存器用来存储下一次要发送的从机地址。
它包含了一个7位或者10位从机地址空间,当I2C工作在非全数据模式时(I2CMDR.FDF=0),寄存器中的地址是传输的首帧数据。
如果寄存器中地址值非全零,那该地址对应一个指定的从机;如果寄存器中的地址为全零,地址就为广播地址,呼叫所有挂在总线上的从机。
如果选择7位地址模式(I2CMDR.XA=0),只有位6到位0是可用的,位9到位7写0。
1.1.8I2C模块自身地址寄存器——I2COARI2C模块使用该寄存器从所有挂在总线上的从机中找出属于自己的从机。
如果选择7位地址模式(I2CMDR.XA=0),只有位6到位0是可用的,位9到位7写0。
一般DSP上面都集成了I2C模块,这样在连接外部器件时可以很方便的控制外部的器件。
I2C 基本上都是用于外部控制的,因为是是串行总线。
在我们的实验板上I2C总线连接到了两个从设备上面,一个是我们的eeprom,另一个是我们的音频芯片AIC23。
通过I2C协议我们写入和读取eeprom数据,控制AIC23的声音一些属性!简介一下I2C协议的规则:一. 技术性能:工作速率有100K和400K两种;支持多机通讯;支持多主控模块,但同一时刻只允许有一个主控;由数据线SDA和时钟SCL构成的串行总线;每个电路和模块都有唯一的地址;每个器件可以使用独立电源二. 基本工作原理:以启动信号START来掌管总线,以停止信号STOP来释放总线;每次通讯以START开始,以STOP结束;启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R/W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号;每个数据字节在传送时都是高位(MSB)在前;写通讯过程:1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;2. 发送一个地址字节(包括7位地址码和一位R/W);3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);4. 主控收到ACK后开始发送第一个数据字节;5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;读通讯过程:1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;2. 发送一个地址字节(包括7位地址码和一位R/W);3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);4. 主控收到ACK后释放数据总线,开始接收第一个数据字节;5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束;6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;DSP中IIC模块框图:1. 总线空闲状态SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;2. 启动信号START时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。
DSP28030中I2C协议学习&EEPROM24c08读写(原创)1.功能概述每一个连接到I2C总线上的设备都有一个独一无二的地址,每一个设备都可以作为发送者或者接受者。
连接在总线上的设备可以作为master也可以作为slave。
Master首先在总线上发送数据,并且产生控制数据传输的时钟信号。
在传输过程中,任何被master编址的设备都是slave。
支持多master和多salve模式。
SDA与SCL都是双向,并且需要上拉电阻,连个端口都是开漏极输出,在需要线与的场合应用。
传输主要有两种模式:(1)标准模式:精确地传输n个数据,由寄存器控制(2)重复模式:一直发送数据直到通过软件产生一个stop信号或者是新的start信号。
I2CDXR是数据发送寄存器,I2CXSR是数据发送移位寄存器;I2CDRR是数据接收寄存器,I2CRSR是数据接收移位寄存器,各个寄存器名字很像,需要注意区分。
2.时钟产生:I2C的传输速度一般为100kbps—400kbps一般不会超过400,在dsp中I2C的module 时钟首先由sysclock分频产生,然后再对module clock进行进一步分频产生所需要的SCL 通过SCL端口传输的时钟总线上。
DSP中由I2CPSC进行分频得到module clock:Module clock的速率要在7-12mhz之间。
Master模式下的时钟是module clock的时钟周期的多个,由I2CCLKL和I2CCLKH决定:D的取值是由IPSC决定的:3.数据有效性在sda上的数据需要在时钟周期为高的时候保持稳定,只有在时钟信号为低的时候才能对数据线上数据进行变化。
4.I2Cmodule有四种作为数据传输的master和slave的模式。
如果module为master,首先开始是master发送模式,然后发送特定的salve地址。
在向slave传输数据时候必须保持为master发送模式。
I2C总线原理及应用实例I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。
例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。
可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
;1 ;I2C总线特点;I2C总线最主要的优点是其简单性和有效性。
由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。
总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。
一个主控能够控制信号的传输和时钟频率。
当然,在任何时间点上只能有一个主控。
;2 ;I2C总线工作原理; 2.1 总线的构成及信号类型;I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。
各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
;I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
DSP虚拟I2C总线软件包设计及应用实例摘要:实现了一种全集成可变带宽中频宽带低通滤波器,讨论分析了跨导放大器-电容(OTA—C)连续时间型滤波器的结构、设计和具体实现,使用外部可编程电路对所设计滤波器带宽进行控制,并利用ADS软件进行电路设计和仿真验证。
仿真结果表明,该滤波器带宽的可调范围为1~26 MHz,阻带抑制率大于35 dB,带内波纹小于0.5 dB,采用1.8 V电源,TSMC 0.18μm CMOS工艺库仿真,功耗小于21 mW,频响曲线接近理想状态。
关键词:Butte数字信号处理器(DSP)在各领域中的应用已日趋广泛,其中TI(TEXAS INSTRUMENT)公司的TMS320系列芯片占据了主导地位。
TMS320F206(简称F206)由于具有片内32K字的Flash,支持JTAG扫描端口的仿真调试,并支持程序的串行下载,便于开发设计及产品的软件升级,因而在中高档仪器开发中受到青睐。
DSP的处理速度虽然较高,但直接支持的I/O口线较少,控制能力相对较弱,因而与外部器件接口采用串行方式较为适合。
常用的串行接口和串行总线有UART、I2C总线,由于I2C总线提供了较完善的总线协议,且接口电路简单,因而得到广泛的应用。
目前,已有很多外围器件支持I2C接口,但多数MCU并不直接支持I2C总线,因而采用I/O口线模拟I2C的方式成为一种通用解决方案。
但由于I2C总线协议的复杂性及操作管理的特殊性,仍给此类方式的开发造成了较大不便。
好在文献中提出了一种按平台模式设计的、适用于80C51的虚拟I2C总线软件包,大大简化了80C51的I2C接口程序设计,使用户无需了解I2C总线协议的细节,即可实现相应的接口。
文献中也给出了一种用于MSP430单片机的软件包。
由于DSP尚无此类软件包,为简化DSP的此类I2C接口程序设计,本文参照文献中的设计原则,设计了一种适用于TMS320C2XX系列DSP开发的软件包。
注意:本例分析基于DSP2808中的i2c_eeprom示例程序和AT24C1024 EEPROM存储器。
当然,在学IIC之前要了解一下IIC工作流程,知道AT24C1024存储芯片的使用方法。
现在按以下4部分来介绍这个示例。
1.示例程序中几种状态说明第一次看i2c_eeprom示例程序,对程序中的MsgStatus信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。
先把程序中的头文件涉及的7种状态分析一下。
// I2C Message Commands for I2CMSG struct#define I2C_MSGSTAT_INACTIVE 0x0000 //未激活状态:一般成功发送数据或者//接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。
#define I2C_MSGSTAT_SEND_WITHSTOP 0x0010 //发送带停止位数据:这是为写数据而设///的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。
#define I2C_MSGSTAT_WRITE_BUSY 0x0011 //写数据忙状态:在将待写的数据放入//缓存后,就可以使能IIC传输数据了,然后把信息状态设为该状态,意在告诉用户:数据//已经在传送过程中。
当然是否传送完毕,还需要通过查询SCD位来判断。
#define I2C_MSGSTAT_SEND_NOSTOP 0x0020//发送无停止位数据:这个状态是为了读//取数据而设的,有查阅过AT24C1024EEPROM存储器使用手册的读者知道,在读数据之前//要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。
设为这个状//态意在告诉读者,可以发送要读取的数据的地址了。
#define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0x0021//发送无停止位数据忙状态:这个状态是//为了读取数据而设的,似于I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。
//传送是否成功,还要看ARDY的状态。
#define I2C_MSGSTAT_RESTART 0x0022//重发开始位状态:这个状态也是为读取////数据而设。
我们知道,读取存储器数据主要分两个步骤:第一,发送START位+设备地址//+数据地址+无停止位。
第二,再发START位+设备地址,紧接着存储器发送数据到IIC接收//缓存器(I2CDRR),接收到设定好的数据数量(I2CCNT值)时输出停止位STOP.//值得注意的是:理论上写完数据就能马上读取数据,但事实上EEPROM存储器仍需要一////定延时来存储数据,约有2ms左右。
通过示波器可以观察到,写完数据后,并不能马上//成功读取数据,也就是说读数据的第一步骤要重复好几次(总线为50K时,大约要重复//8次)才能成功。
#define I2C_MSGSTAT_READ_BUSY 0x0023//读取数据忙状态:这个状态是为读取数//据而设。
在读数据的第二步骤中,发完START位+设备地址后,就设为这一状态。
意在说//明IIC开始等待接收固定数量(I2CCNT值)的数据。
可以通过查询ARDY位判断。
//头文件中的其他定义应该没什么大问题了!2.AT24C1024 EEPROM读写数据格式(2)单字节写入:START -> 发送从设备地址(写控制码R/W=0) -> 处理Ack -> 发送字节地址 -> 处理Ack [-> 发送1字节数据 -> 处理Ack] -> STOP。
如下图:(3)按页写入: START -> 发送从设备地址(写控制码R/W=0) -> 处理Ack -> 发送字节地址 -> 处理Ack [-> 发送1字节数据 -> 处理Ack-> 发送第2字节数据 -> 处理Ack-> 发送第3字节数据 -> 处理Ack……直到发完X字节] -> STOP。
如下图。
注意,连续写入的数据字节数不能超过每页所能容下的总量。
如果写入的数据超过一页的长度,将发生回卷,即从EEPROM的0地址处进行数据覆盖。
比如,AT24C1024有512页,每页最大容纳256字节。
超过这个长度,地址指针将从每页首地址重新开始。
(4)随机单字节读取:第一步:发START -> 发送从设备地址(写控制码R/W=0) -> 处理Ack -> 发送字节地址高位 -> 处理Ack -> 发送字节地址低位 -> 处理Ack -> 第二步:发START -> 发送器件地址(读控制码R/W=1) -> 处理Ack -> 接收1字节数据 -> STOP。
(5)随机连续读取:在随机单字节读取操作的STOP信号发送之前,加入若干个[-> 发送Ack -> 接收1字节数据] 即可实现。
(6)当前位置单字节读取:START -> 发送从设备地址(读控制码) -> 处理Ack -> 发送字节地址 -> 处理Ack -> 接收1字节数据 -> STOP。
当前指的是之前进行过读取操作但是没有发送STOP信号,EEPROM芯片内部指针所在的位置即为当前位置。
(7)当前位置连续读取:在当前位置单节读取操作的STOP信号发送之前,加入若干个 [-> 发送Ack -> 接收1字节数据] 即可实现。
备注:部分内容引用百度文库中的《I2C读写流程》文档3.主程序说明及流程图详细的注释可以参见程序附录,,这里主要解释一下设备地址取0x50的缘由。
从AT24C1024的数据手册可知,设备地址为。
而在程序中设置的地址是0x50,即0B0101 0000。
看似不妥,其实,这个例子中设备地址采用7位地址模式,这样只取0x50的低7位作为设备地址的高七位,设备地址的最低位R/W则由寄存器I2CMDR中的TRX位决定。
这样读数据时设备地址为0B1010 0001,写数据时设备地址改为0B1010 0000。
通过示波器可以验证这些数据。
问题1:每次检测到SCD中断时,也就是顺利发完指定数量的数据或者接收指定数量的数据了,理论上I2caRegs.I2CCNT==0,但是本人设了几个中断点去观察该寄存器的值,发现总是不为零。
通过观察I2caRegs.I2CFFTX.bit.TXFFST和I2caRegs.I2CFFRX.bit.RXFFST,可以发现这两个寄存器为零时,I2caRegs.I2CCNT也不为零。
由此可知,I2CCNT不能实时反映发送/接收存储器中数据的数量,不过可以用TXFFST/RXFFST来代替。
图1 主程序流程图,图2为写数据程序流程图,图3为读数据程序流程图,图4为中断函数流程图。
图2写数据程序流程图图3读数据程序流程图4.程序附录//可以用以下代码替换示例程序Example_280xI2c_eeprom.c中的代码,再进行调试。
// //该程序跟原始程序没多大区别,主要改变为:引入几个统计变量,改变发送数据长度为2字节// // TI File $Revision: /main/5 $// Checkin $Date: April 4, 2007 17:18:36 $//###########################################################################//// FILE: Example_280xI2c_eeprom.c//// TITLE: DSP280x I2C EEPROM Example//// ASSUMPTIONS://// This program requires the DSP280x header files.//// This program requires an external I2C EEPROM connected to// the I2C bus at address 0x50.//// As supplied, this project is configured for "boot to SARAM"// operation. The 280x Boot Mode table is shown below.// For information on configuring the boot mode of an eZdsp,// please refer to the documentation included with the eZdsp,//// Boot GPIO18 GPIO29 GPIO34// Mode SPICLKA SCITXDA// SCITXB// -------------------------------------// Flash 1 1 1// SCI-A 1 1 0// SPI-A 1 0 1// I2C-A 1 0 0// ECAN-A 0 1 1// SARAM 0 1 0 <- "boot to SARAM"// OTP 0 0 1// I/0 0 0 0//// DESCRIPTION://// This program will write 1-14 words to EEPROM and read them back.// The data written and the EEPROM address written to are contained// in the message structure, I2cMsgOut1. The data read back will be// contained in the message structure I2cMsgIn1.// --------------------------------------------------------------// CODE MODIFICATIONS ARE REQUIRED FOR 60 MHZ DEVICES (In// DSP280x_Examples.h in the common/include/ directory, set// #define CPU_FRQ_60MHZ to 1, and #define CPU_FRQ_100MHZ to 0).// --------------------------------------------------------------// This program will work with the on-board I2C EEPROM supplied on// the F280x eZdsp.//////###########################################################################// Original Author: D.F.//// $TI Release: DSP280x Header Files V1.60 $// $Release Date: December 3, 2007 $//############################################################################include "DSP280x_Device.h" // DSP280x Headerfile Include File#include "DSP280x_Examples.h" // DSP280x Examples Include File// Note: I2C Macros used in this example can be found in the// DSP280x_I2C_defines.h file// Prototype statements for functions found within this file.void I2CA_Init(void);Uint16 I2CA_WriteData(struct I2CMSG *msg);Uint16 I2CA_ReadData(struct I2CMSG *msg);interrupt void i2c_int1a_isr(void);void pass(void);void fail(void);#define I2C_SLAVE_ADDR 0x50 //EEPROM地址#define I2C_NUMBYTES 2 //为方便示波器观察,设置发送2字节的数据#define I2C_EEPROM_HIGH_ADDR 0x11 //数据的写入地址高位#define I2C_EEPROM_LOW_ADDR 0x0F //数据的写入地址低位// Global variables//全局变量// Two bytes will be used for the outgoing address,//有2个字节是地址// thus only setup 14 bytes maximum//最多只能设置14字节数据struct I2CMSG I2cMsgOut1={I2C_MSGSTAT_SEND_WITHSTOP,//初始状态为:发送带停止位数据I2C_SLAVE_ADDR,I2C_NUMBYTES,I2C_EEPROM_HIGH_ADDR,I2C_EEPROM_LOW_ADDR,0xff, // Msg Byte 010x3F, // Msg Byte 020x56, // Msg Byte 030x78, // Msg Byte 040x9A, // Msg Byte 050xBC, // Msg Byte 060xDE, // Msg Byte 070xF0, // Msg Byte 080x11, // Msg Byte 090x10, // Msg Byte 100x11, // Msg Byte 110x12, // Msg Byte 120x13, // Msg Byte 130x12, // Msg Byte 14};struct I2CMSG I2cMsgIn1={ I2C_MSGSTAT_SEND_NOSTOP,I2C_SLAVE_ADDR,I2C_NUMBYTES,I2C_EEPROM_HIGH_ADDR,I2C_EEPROM_LOW_ADDR};struct I2CMSG *CurrentMsgPtr; // Used in interruptsUint16 PassCount;Uint16 FailCount;Uint16 ARDY_ISRC_NACK_number=0; //统计ARDY中断源引起的中断中NACK次数Uint16 SCD_ISRC_number=0; //统计SCD中断源引起的中断次数Uint16 ARDY_ISRC_number=0; //统计ARDY中断源引起的中断次数Uint16 all_ISRC_number=0; //统计所有中断源引起的中断次数Uint16 Write_load_num=0; //统计写数据函数调用次数Uint16 Read_load_num1=0; //统计读数据函数调用次数1第一步骤Uint16 Read_load_num2=0; //统计读数据函数调用次数2第二步骤void main(void){Uint16 Error;Uint16 i;CurrentMsgPtr = &I2cMsgOut1;// Step 1. Initialize System Control:// PLL, WatchDog, enable Peripheral Clocks// This example function is found in the DSP280x_SysCtrl.c file.InitSysCtrl();// Step 2. Initalize GPIO:// This example function is found in the DSP280x_Gpio.c file and// illustrates how to set the GPIO to it's default state.// InitGpio();// Setup only the GP I/O only for I2C functionalityInitI2CGpio();// Step 3. Clear all interrupts and initialize PIE vector table:// Disable CPU interruptsDINT;// Initialize PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared.// This function is found in the DSP280x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).// This will populate the entire table, even if the interrupt// is not used in this example. This is useful for debug purposes.// The shell ISR routines are found in DSP280x_DefaultIsr.c.// This function is found in DSP280x_PieVect.c.InitPieVectTable();// Interrupts that are used in this example are re-mapped to// ISR functions found within this file.EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.I2CINT1A = &i2c_int1a_isr;EDIS; // This is needed to disable write to EALLOW protected registers// Step 4. Initialize all the Device Peripherals:// This function is found in DSP280x_InitPeripherals.c// InitPeripherals(); // Not required for this exampleI2CA_Init();// Step 5. User specific code// Clear CountersPassCount = 0;FailCount = 0;// Clear incoming message bufferfor (i = 0; i < I2C_MAX_BUFFER_SIZE; i++){I2cMsgIn1.MsgBuffer[i] = 0x0000;}// Enable interrupts required for this example// Enable I2C interrupt 1 in the PIE: Group 8 interrupt 1PieCtrlRegs.PIEIER8.bit.INTx1 = 1;// Enable CPU INT8 which is connected to PIE group 8IER |= M_INT8;EINT;// Application loopfor(;;){//////////////////////////////////// Write data to EEPROM section ////////////////////////////////////// Check the outgoing message to see if it should be sent.// In this example it is initialized to send with a stop bit.if(I2cMsgOut1.MsgStatus == I2C_MSGSTAT_SEND_WITHSTOP){ Write_load_num++;Error = I2CA_WriteData(&I2cMsgOut1);// If communication is correctly initiated, set msg status to busy//如果通信已经正确初始化,设置msg状态为’忙‘,并// and update CurrentMsgPtr for the interrupt service routine. //更新作为中断服务路径的指针CurrentMsgPtr。