DSP2808中i2c实例分析
DSP28335I2C接口应用
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总线原理及应用实例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总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
DSP28335 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总线原理及应用实例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 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 电源芯片。
DSP28335 I2C寄存器中文资料及例程
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-IIC
一般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模块学习&EEPROM 24c08读写(原创)
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总线原理及应用实例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总线软件包设计及应用实例(精)
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开发的软件包。
I2C实例解析
实例解析linux内核I2C体系结构(1)一、概述谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完成。
下面比较下这两种驱动。
第一种方法的好处(对应第二种方法的劣势)有:●思路比较直接,不需要花时间去了解linux内核中复杂的I2C子系统的操作方法。
第一种方法问题(对应第二种方法的好处)有:●要求工程师不仅要对I2C设备的操作熟悉,而且要熟悉I2C的适配器操作;●要求工程师对I2C的设备器及I2C的设备操作方法都比较熟悉,最重要的是写出的程序可移植性差;●对内核的资源无法直接使用。
因为内核提供的所有I2C设备器及设备驱动都是基于I2C子系统的格式。
I2C适配器的操作简单还好,如果遇到复杂的I2C适配器(如:基于PCI的I2C适配器),工作量就会大很多。
本文针对的对象是熟悉I2C协议,并且想使用linux内核子系统的开发人员。
网络和一些书籍上有介绍I2C子系统的源码结构。
但发现很多开发人员看了这些文章后,还是不清楚自己究竟该做些什么。
究其原因还是没弄清楚I2C子系统为我们做了些什么,以及我们怎样利用I2C子系统。
本文首先要解决是如何利用现有内核支持的I2C适配器,完成对I2C设备的操作,然后再过度到适配器代码的编写。
本文主要从解决问题的角度去写,不会涉及特别详细的代码跟踪。
二、I2C设备驱动程序编写首先要明确适配器驱动的作用是让我们能够通过它发出符合I2C标准协议的时序。
在Linux内核源代码中的drivers/i2c/busses目录下包含着一些适配器的驱动。
如S3C2410的驱动i2c-s3c2410.c。
当适配器加载到内核后,接下来的工作就要针对具体的设备编写设备驱动了。
编写I2C设备驱动也有两种方法。
一种是利用系统给我们提供的i2c-dev.c来实现一个i2c 适配器的设备文件。
然后通过在应用层操作i2c适配器来控制i2c设备。
i2c总线的工作原理与应用
i2c总线的工作原理与应用1. 简介i2c(Inter-Integrated Circuit)总线是一种常见的串行通信总线,用于在集成电路之间进行数据传输。
它采用两根线(SDA和SCL)进行通信,支持多主机和多从机的连接。
i2c总线通常用于连接传感器、存储器、显示器等设备。
2. 工作原理i2c总线采用主从式架构。
主机(Master)负责控制总线的访问和数据传输,从机(Slave)接收并响应主机的指令。
2.1 信号线i2c总线有两根信号线:•SDA(Serial Data Line):用于传输数据。
•SCL(Serial Clock Line):用于同步数据传输。
2.2 传输模式i2c总线支持两种传输模式:•标准模式(Standard Mode):最大传输速率为100kbps。
•快速模式(Fast Mode):最大传输速率为400kbps。
2.3 通信流程i2c总线的通信流程如下:1.主机发送起始信号(Start):主机将SDA从高电平拉到低电平,然后拉低SCL线。
2.主机发送地址和读写位:主机发送从机的地址和读写位,指定数据是读取还是写入操作。
3.从机应答:从机接收地址和读写位后,发送应答信号(ACK)给主机。
4.数据传输:主机和从机之间传输数据,每个字节都要从高位(MSB)依次传输到低位(LSB)。
5.应答验证:每个字节传输后,接收方发送应答信号,表示接收成功。
6.停止信号(Stop):主机发送停止信号,将SDA从低电平拉到高电平,然后拉高SCL线。
应用案例i2c总线广泛应用于各种电子设备中,以下是一些常见的应用案例:3.1 传感器模块传感器模块通常使用i2c总线进行数据传输。
例如,温度传感器可以通过i2c 总线将实时温度数据发送给主控制器,以便进行温度监测和控制。
3.2 存储器i2c总线可以连接到存储器芯片,用于存储和读取数据。
例如,实时时钟芯片可以使用i2c总线来存储和读取时间数据。
3.3 显示器一些液晶显示器可以通过i2c总线进行控制和数据传输。
I2C开发实例说明解读
三态电路代码
always @(posedge clk or negedge reset_n) if (!reset_n) sda_inner <= 1'b0 ; else if (sda_output_enable) sda_inner <= sda_output; else sda_inner <= 1')
clk sda_in
sda_in_d1
~sda_in_d1
sda_in_pos
再检测SDA上升沿是否在SCL高电平下
代码实现
//detect sda stop always @(posedge clk or negedge reset_n) if (!reset_n) sda_stop <= 1'b0 ; else if (scl_in_d2) if (sda_in_pos) sda_stop <= 1'b1 ; else sda_stop <= 1'b0 ; …………………..
assign I2C_SDA = sda_inner; assign sda_input = I2C_SDA ;
三态电路注意事项总结
在写数据时方向为主—从,则enable位高 无效,此时SDA位输入方向 当从器件响应时,则enable为低电平此时 输出响应位SDA为输出方向
默认SDA位输入
起始和停止条件
SCL为高电平时,SDA从高电平到低电平转 换,这个条件表示为起始条件 SCL为高电平时,SDA从低电平到高电平转 换,这个条件表示为停止条件
传输字节格式
发送到SDA线必须为8位 每次可以传输的字节数量没有限制 每个字节后必须跟一个响应位
DSP技术下I2C布局与抗干扰该如何设计
DSP 技术下I2C 布局与抗干扰该如何设计在智能手机以及平板电脑的设计应用方面,基于DSP 技术所设计研发的PCB 板是不可缺少的重要组成部分,其中I2C 信号线的整体布线布局和抗干扰能力,能够直接决定DSP 程序指令能否正确发送并执行。
我们将通过下文对I2C 布线布局设计和抗干扰能力如何增强,做进一步的介绍和分析。
I2C 布线应当受到足够的保护在通讯领域,I2C 信号线属于低速控制型信号线,所以在智能手机、平板电脑的PCB 板设计时,工程师仅需要按照一般的控制IO 进行布线处理即可,无需做特别的保护设计,一般情况下不用担心I2C 受到噪声源干扰。
不过,在一些特定的情况下,比如在进行折叠型手机或平板、滑盖型手机的设计时,由于I2C 信号线需要通过转轴或滑轨处的FPC,信号路径长,与天线的距离也比较近,此时开漏设计输出级对地阻抗加大,所以这种情况下I2C 信号线对一些电磁干扰波比较敏感,很容易受到RF 信号源的干扰。
在这种情况下,工程师需要对I2C 信号线提供一些有力的保护措施,例如将I2C 的信号线设计成等长度地平行走线,或是在两边加地线进行保护以避免临近层出现高速信号线等。
上拉电阻应安置在OD 输出端附近上拉电阻的合理设置,可以对干扰波进行有效的阻挡。
通常情况下,如果主从器件两端均为OD 输出时,上拉电阻应当放置在信号路径的中间位置。
如果主设备端是软件模拟时序,而从设备是OD 输出时,那幺工程师需要将电阻安置在靠近从设备的位置。
除此之外,I2C 协议还特别定义了电阻Rs。
Rs 电阻在该线路中的设置能够有效抑制总线上的干扰脉冲进入从设备,提高可靠性。
通常情况下,Rs 电阻的阻值一般都会选用100hm—200ohm 之间的。
单片机中I2C总线接口技术应用案例分析
单片机中I2C总线接口技术应用案例分析I2C总线接口技术是一种广泛应用于单片机系统中的通信协议。
它具有简单、灵活、可靠的特点,可以用于连接多个外设,实现数据的传输和互动。
在本文中,我们将通过分析几个实际案例,探讨I2C总线接口技术在单片机系统中的应用。
案例一:温度传感器假设我们有一个温度传感器,希望将其与单片机相连,以便读取当前环境温度。
这时,我们可以使用I2C总线接口技术来实现数据的传输。
首先,我们需要连接传感器的SCL(时钟线)和SDA(数据线)引脚到单片机相应的引脚。
然后,在单片机的代码中,我们可以通过编写相应的I2C通信协议,向传感器发送读取温度数据的指令,并接收传感器返回的温度数值。
通过这种方式,我们可以轻松地获取环境温度,实现相应的温度控制策略。
案例二:智能显示屏假设我们有一个智能显示屏,希望将其与单片机连接,实现数据的双向传输。
这时,我们可以使用I2C总线接口技术来实现。
首先,我们需要连接显示屏的SCL和SDA引脚到单片机的相应引脚。
然后,在单片机的代码中,我们可以通过编写I2C通信协议,向显示屏发送显示内容的指令,并接收显示屏返回的用户操作指令。
通过这种方式,我们可以实现与智能显示屏之间的数据交互,从而实现更加智能化的用户界面。
案例三:扩展存储设备假设我们需要为单片机系统提供额外的存储空间,以便存储更多的数据。
这时,我们可以使用I2C总线接口技术连接一个外部的存储设备。
首先,我们需要连接存储设备的SCL和SDA引脚到单片机相应的引脚。
然后,在单片机的代码中,我们可以通过编写I2C通信协议,向存储设备发送写入数据的指令,并接收存储设备返回的读取数据的指令。
通过这种方式,我们可以扩展单片机系统的存储容量,提供更大的数据存储空间。
案例四:外部设备控制假设我们需要控制一个外部设备,例如LED灯或者电机。
这时,我们可以使用I2C总线接口技术连接外设的控制接口到单片机。
首先,我们需要接线连接外设的SCL和SDA引脚到单片机相应的引脚。
DSP28335 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//重发开始位状态:这个状态也是为读取////数据而设。
DSP原理及应用技术第7.4节 I2C模块
7.4.3 I2C模块中断请求
1. 基本的I2C中断请求
如图7-50所示,I2C模块通过复用一个仲裁器向CPU发送一个 I2C中断请求。每个中断请求在状态寄存器(I2CSTR)中有一个标 志位,在中断使能寄存器(I2CIER)中有一个使能位。当一个指定 的事件发生时,它的标志位被置位。如果相应的使能位为0,则中 断请求被拦截;而如果使能位为1,请求作为I2C中断转发给CPU。
Байду номын сангаас
7.4.1 I2C模块概述
4.I2C模块的主要组成
I2C模块结构框图如图7-39所示
图7-39 I2C模块结构框图
7.4.1 I2C模块概述
4.I2C模块的主要组成 I2C模块主要包含:
➢ 一个串行接口:一个数据引脚(SDA)和一个时钟引脚(SCL) ➢ 数据寄存器和FIFO:暂时保存SDA引脚与CPU之间传递的接收数
7.4.3 I2C模块中断请求
1. 基本的I2C中断请求
I2C总线模块产生的中断请求如表7-50所述。I2C中断是CPU可
屏蔽中断之一。和其它中断请求一样,如果已在CPU内被使能,则
执行相应的中断服务程序(I2CINT1A_ISR)。可以通过读中断源寄
存器I2CISRC的值来确定I2CINT1A_ISR中断源(中断事件),这便
据和发送数据。 ➢ 控制和状态寄存器。 ➢ 外围总线接口:用于CPU访问I2C模块寄存器和FIFOs。 ➢ 时钟同步器:用来使I2C输入时钟(由DSP时钟源产生)和SCL引
脚的时钟同步,并且使数据发送器与不同的主机时钟速度同步 ➢ 对输入到I2C模块的时钟进行分频的预定标器。 ➢ SDA和SCL引脚上的噪声滤波。 ➢ 用来处理I2C模块和其它主器件的仲裁问题的仲裁器。 ➢ 中断产生逻辑,用以向CPU发送中断信号。 ➢ FIFO中断产生逻辑:以便在I2C模块中接收数据或发送数据时能
TMS320F2802或2808的DSP开发板原理图(密)
24 23 22 21 20 19 18 17 16 15 14 13
+5V FO_IN U_IN V_IN W_IN A_IN B_IN Z_IN
SR0805 SR0805 SR0805 SR0805 SR0805 SR0805 SR0805 SR0805
Байду номын сангаас
56 58 60 61 64 70 1 95 8 9 50 52 54 57 63 67 71 72 83 91 99 79 92 4 6 7 100 5 43
R49 SR08052K
R50 SR08052K
R51 SR08052K
R52 SR08052K
R53 SR08052K
1
SR0805
SR0805
OUTA OUTB OUTC OUTD
3 13 5 11
A_IN B_IN Z_IN U_IN_75175
3
2
JP3 JUMPER3Pin JUMPER3P
A/CCTRL B/DCTRL VCC GND 8
14 25 13 39
VSSA2 VSSAIO VSS1AGND VSS2AGND TRST EMU0 EMU1 TMS TCK TDI TDO XRS XCLKOUT XCLKIN X2 X1 TEST1 TEST2
PWM1A PWM1B PWM2A PWM2B PWM3A PWM3B
SR0805 SR0805 SR0805 SR0805 SR0805 SR0805
3 2
20MHz/3.3V
R64 62 SR0805
1
C52 100pF SC0805
GPIO6 ECAP2/GPIO7 ADCSOCAO/GPIO8 GPIO9 ADCSOCBO/GPIO10 GPIO11 TZ1/SPISIMOB/GPIO12 TZ2/SPISOMIB/GPIO13 TZ3/SPICLKB/GPIO14 TZ4/SPISTEB/GPIO15 TZ5/SPISIMOA/GPIO16 TZ6/SPISOMIA/GPIO17 SPICLKA/GPIO18 SPISTEA/GPIO19 QEP1/GPIO20 QEP2/GPIO21 EQPE1S/GPIO22 EQPE1I/GPIO23 ECAP1/SPISIMOB/GPIO24 ECAP2/SPISOMIB/GPIO25 SPICLKB/GPIO26 SPISTEB/GPIO27 TZ5/SCIRXDA/GPIO28 TZ6/SCITXDA/GPIO29 CANRXA/GPIO30 CANTXA/GPIO31 SDA/GPIO32 SCL/GPIO33 GPIO34
I2C协议解析及实测波形
v o i d I 2 C S t o N) {
D D R A
_
—
D DR A 1 =0 xFF ;
AT 2 4 C02一S CI = 1;
A T24C0 2 SDA =O:
d e l a y i 5 uቤተ መጻሕፍቲ ባይዱs ( ) ;
AT2 4 C 0 2 一 S D A=l ;
一 —
D D R A 1 =0 XFF ;
AT2 4C 0 2一SCI = 1;
A T24C0 2 SDA = 1;
d e l a y1 5 u s ( ) ; AT 2 4 C 0 2 一 S D A- 0 ; d e l a yl 5 u s ( ) ; A T2 4 C 0 2 一 S C L = 0 ; d e l a y1 5 u s ( ) ; }
l }
图 2结 束信 号
收 稿 日期 : 2 ( ) 1 6 -1 1 -0 4
图 4 实测 结 束 信 号 波 形
作 者 简介 : 林倩 ( 1 9 8 8 -) , 女, 福 建福 州人 , 本科, 实验 员 , 助理实验师, 研 究方 向 : 电 气工 程 。
应 用研 究
l致 字 技 术
d e l a y1 5 u s ( ) ;
} 小节 的写一个字节 函数里面 。 先来 看 I ; S CL  ̄ I 脚和s DA引脚的定 这两 个 函数 是 按 照 图 l 和 图2 的时 序 写 的 , 读 者可 以结 合上 述 的 义: 两个 图来 理 解 该 程 序 。 实 测 的 这 两 个 信 号 的 波 形 如 3 和 4 所示 。 #d e f i n e AT2 4 C0 2 一 S DA P ORTA— PA1 上 两 个 图中 , 通道一的波形为S C L 引脚的波形, 通 道 的 波 形 #d e in f e AT2 4 C0 2 一 S CL PORTA— P A0 为S D A的波 形 。 从图3 上实 测的时间可以看出 , 当S C L 为 高 电平 时 , / / I 2 C 总 线 初 始 化 函 数 v o i d I 2 C i n i t ( ) { D D RA — D DRA 0 = 0 x F F; / / I O口设 为 输 出
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注意:本例分析基于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。