基于C语言的I2C总线软件模块设计
nu m)
功 能:用for()循环提供延时。在实际应用中可依具体情况改变传入参数,但必须满足I2C总线时序中对SCL高、低电平周期的要求,本应用中取1,调用形式为delay(time)。
2)函数原型:void start(void)
功 能:提供I2C总线工作时序中的起始位,在SCL=HIGH期间,SDA出现由高到底的转变,返回前将SCL拉低,允许数据变化,准备传输。其中调用函数1。
3)函数原型:void stop(void)
功 能:函数提供I2C总线工作时序中的起始位,在SCL=HIGH期间,SDA出现由低到高的转变。其中调用函数1。
4)函数原型:void sendbyte(uchar b,uchar*error)
功 能:在时钟作用下,将入口参数b中8位数据由高至低通过SDA线发送,并读回应答信号,存于指针变量*error中。其中调用函数1、2、3。
5)函数原型:void readbyte(uchar*b,bit Ack)
功 能:函数在时钟作用下接收8位数据,存于*b中,先接收的为高位,并发送应答信号(Ack=0),当接收到最后一字节时发送非应答(Ack=1)。其中调用函数1、2、3。
6)函数原型:void send-n-byte(uchar*info,uint n,uchar address,uchar*fault) 功 能:向I2C器件连续发送n个数据字节,数据存于数组info[]中,address为器件受控地址,末位为0(写),n个数据的地址可作为数据字节发送,或设置地址自动加减功能。*fault存收到的应答位。其中调用函数1-4。
7)函数原型:void receive_n_byte(uchar*info,uint n,uchar address,uchar*fault)
功 能:从I2 C器件连续接收n个字节的数据,存于数组info[]中,address为器件地址,本函数保证器件地址末位是1(读),n个数据的器件内地址可作为数据字节发送,或设置地址自动加减功能。收最后一字节时发非应答信号1。*fault存收到的应答位。其中调用函数1-5。
以下仅以sendbyte()函数原型为例说明C51如何具体实现I2C总线的发送:
void sendbyte(uchar b,uchar*error)
{int count;
bit data_bit;
*error=0;
for(count=7;count>=0;count--)
{data_bit=(bit)(b&0x80);
b=b<<1;
/*送数据位,产生时钟脉冲*/
SDA=data_bit;
SCL=LOW;delay(time);
SCL=HIGH;delay(time);
SCL=LOW;delay(time);
}
/*释放数据线,产生时钟脉冲,读回应答*/
SDA=HIGH;
SCL=LOW;delay(time);
SCL=HIGH;delay(time);
*error=(uchar)SDA;
/*释放数据线,时钟置低*/
SDA=HIGH;
SCL=LOW;delay(time);}
4 I2C总线用于HDTV数字地面接收机
数字高清晰度电视HDTV(High Definition Televi-sion)是继黑白电视和彩色电视之后的第三代电视系统,与目前市场上的电视相比,其水平和垂直两个方向的图像质量(分辨率)提高一倍以上,在使用大屏幕显示器或近距离观看时其图像细腻逼真,无闪烁感和粗糙感,质量与35mm电影相当,再配以数字环绕音响,使收视效果大幅度提高。HDTV 节目全部采用数字方式制作、发送和接收,使图像质量接近演播室。同时,数字电视系统还能够提供多种业务,实现交互、数据广播和计算机联网等功能。美国于 1998年11月率先正式开播数字HDTV信号。我国从1996年启动国家重大产业工程项目HDTV功能样机系统研究开发工程,已成功在50周年国庆时进行了数字电视试播。
本HDTV数字地面接收系统以欧洲的DVB-T (Digital Video Broadcasting Terrestrial)为标准,完成信道解调解码,输出标准的MPEG-2码流,由于采用了COFDM(Coded Orthogonal Frequency Division Multi-plexing)编码正交频分复用技术,能有效对抗多经传播和同频干扰。本接收机的主要特点是采用带有I2C总线接口的L64系列芯片,AT89C52通过I2C总线完成对L64芯片内寄存器的读写操作和监控,与PC配合实现基于参数配置、模式转换、状态读取的调试功能。结构简单,调试方便。信道解调解码的硬件基本组成如图2(未画出上拉电阻)。
美国LSILogic公司的L64系列是专用的以DVB为标准的解调解码芯片,该系列内部模块化,接口标准化,且带有I2C 总线接口,连接简单。L64系列功能完善,L64780、L64724、L64768单独使用即可分别完成DVB标准的地面、卫星、有线电视信号解调的全部过程。目前,L64系列可配合使用。如图2,信道出来的信号先经过调谐器变为中频信号,送入L64780完成主要的OFDM解调,其输出经 L64724Viterbi译码,L64768RS译码,完成前向纠错,输出标准的MPEG-2码流。下面仅以L64768为例介绍读写某一寄存器的 C51函数原型及
主要功能:
定义768的受控地址:#define LSI0xfe函数原型:uchar general_call(void)
功 能:general_call()函数调用send_n_byte()函数,发特殊寻址字节0x00和0x06,若应答为零返回0,否则重复上一操作,若发5次后仍无应答返回1。在主程序初始化化时调此函数,主程序根据返回。
函数原型:uchar 768_fec_rd(uint group,uint addr,uint*data)
功 能:768_fec_rd()函数调用send_n_byte()和receive_n_byte(),从FEC寄存器读出一字节数据存于指针变量*data中,group为组号,输入的组号要翻译成相应的组地址group_addr,addr为FEC寄存器地址,LSI作为每次起始信号后的寻址字节。依据768的传输时序,先发addr的低字节,再发送addr的高字节,然后发group_addr,即可读出相应寄存器中的数据。组号出错返回1;收到非应答信号返回0;读正确返回2。主程序根据返回值,做相应操作。
- 一种基于DSP的张力、深度、速度测量系统(04-15)
- I2C总线及EEPROM的Linux驱动程序的设计(01-05)
- 基于MSP430单片机的智能IC卡水表控制器(07-08)
- 实战经验吐血推荐:怎样在Linux环境下轻松实现基于I2C总线的EEPROM驱动程序(07-25)
- 基于FPGA的嵌入式图像采集系统设计(06-05)
- I2C串行总线协议的VHDL实现(06-05)