给大家分享一个IIC_EEPROM_24LC64存储芯片与TMS320F2812 dsp读写操作的源码
dsp源程序如下:
- /*********************************************************************
- ** 实验目的:学习IIC接口的EEPROM数据读写 **
- ** 实验说明:EEPROM采用24LC64芯片,串行数据线和串行时钟线分别由DSP的 **
- ** PA13和PA15控制 **
- ** 实验结果:按照我们下面所设置的断点运行可读出我们写入EEPROM里的值 ** **
- **********************************************************************/
- #include "DSP28_Device.h"
- #include "DSP28_Globalprototypes.h"
- #define SDA1 GpioDataRegs.GPADAT.bit.GPIOA13 = 1////串行数据输出高
- #define SDA0 GpioDataRegs.GPADAT.bit.GPIOA13 = 0////串行数据输出低
- #define SCL1 GpioDataRegs.GPADAT.bit.GPIOA15 = 1////串行时钟输出高
- #define SCL0 GpioDataRegs.GPADAT.bit.GPIOA15 = 0////串行时钟输出低
-
- #define SDAIN EALLOW;GpioMuxRegs.GPADIR.bit.GPIOA13 = 0; EDIS
- #define SDAOUT EALLOW;GpioMuxRegs.GPADIR.bit.GPIOA13 = 1;EDIS
- #define SDADATA GpioDataRegs.GPADAT.bit.GPIOA13
- //24C64 =8K Bytes =13bit Add
- //页编程平均400us写一字节,随机读平均1.8ms读一字节,连续读平均600us一字节
- #define uchar unsigned char /*宏定义*/
- #define uint unsigned int
- void delay(unsigned int t);
- unsigned char ByteRead(unsigned int add,unsigned char *temp);
- unsigned char ByteWrite(unsigned int add,unsigned char dat);
- void main(void)
- {
- unsigned char t,s,a;
- /*初始化系统*/
- InitSysCtrl();
- /*关中断*/
- DINT;
- IER = 0x0000;
- IFR = 0x0000;
- /*初始化PIE*/
- InitPieCtrl();
- /*初始化PIE中断矢量表*/
- InitPieVectTable();
-
-
- InitGpio();
- SDA1;
- SCL1;
- t=0;
- s=ByteWrite(0,0x12);
- delay(10000);
- s=ByteRead(0,&t);
- a=0;//设断点,看变量t的值
- s=ByteWrite(1,0x34);
- delay(10000);
- s=ByteRead(1,&t);
- a=1; //设断点
- s=ByteWrite(2,0x56);
- delay(10000);
- s=ByteRead(2,&t);
- a=2; //设断点
- s=ByteWrite(3,0x78);
- delay(10000);
- s=ByteRead(3,&t);
- a=3; //设断点
- for(;;);
- }
- void delay(unsigned int t)
- {
- while(t>0) t--;
-
- }
- //总线无效期间二线全为主高,总线有效期间时钟线为低,一个高低跳变为一个时钟
- //周期,时钟线为低时才能改变数据线状态,若时钟线为高时改变数据线状态,则只
- //能是开始或结束总线操作
- unsigned char ack; /*应答标志位*/
-
- /*******************************************************************
- 起动总线函数
- 时钟线在高电平时,数据线从高向低的跳变开始总线,最终二线全变低
- 函数原型: void Start_I2c();
- 功能: 启动I2C总线,即发送I2C起始条件.
- ********************************************************************/
- void Start_I2c()
- {
- SDA1; /*先跳高,为稍后的从高向低跳作准备*/
- delay(60);
- SCL1;
- delay(500); /*起始条件建立时间大于4.7us,延时*/
- SDA0; /*发送起始信号*/
- delay(60); /* 起始条件锁定时间大于4μs*/
- SCL0; /*钳住I2C总线,准备发送或接收数据 */
- delay(60);
- }
- /*******************************************************************
- 结束总线函数
- 时钟线在低电平时,数据线从低向高的跳变结束总线,最终二线都变高
- 函数原型: void Stop_I2c();
- 功能: 结束I2C总线,即发送I2C结束条件.
- ********************************************************************/
- void Stop_I2c()
- {
- SDA0; /*先跳低,为稍后的从低向高跳变作准备*/
- delay(60);
- SCL1; /*发送结束条件的时钟信号,结束条件建立时间大于4μs*/
- delay(60);
- SDA1; /*发送I2C总线结束信号*/
- delay(60);
- }
- /*******************************************************************
- 字节数据发送函数
- 函数原型: void SendByte(uchar c);
- 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
- 此状态位进行操作.(不应答或非应答都使ack=0)
- 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
- ********************************************************************/
- unsigned char SendByte(uchar c)
- {
- uchar BitCnt,t[8];
- for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
- {
- if((c<<BitCnt)&0x80)
- t[BitCnt]=1; /*判断发送位*/
- else
- t[BitCnt]=0;
- }
-
- SCL0;
- delay(4);
- for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
- { SCL0;
- if(t[BitCnt])SDA1; /*判断发送位*/
- else SDA0;
- delay(60);
- SCL1; /*置时钟线为高,通知被控器开始接收数据位*/
- delay(60); /*保证时钟高电平周期大于4μs*/
-
- // if((BitCnt==7) && t[BitCnt])
- // SDAIN; //设为输入
- }
-
- SCL0;
- SDAIN; //设为输入
- delay(60);
- SCL1;
- if(SDADATA)ack=1; //没有收到应答信号
- else ack=0; //收到应答信号
- delay(60);
- SCL0;
- delay(60);
- SDAOUT; //重新设为输出
-
-
- return ack;
- }
- /*******************************************************************
- 字节数据接收函数
- 函数原型: uchar RcvByte();
- 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
- 发完后请用应答函数应答从机。
- ********************************************************************/
- uchar RcvByte()
- {
- uchar retc;
- uchar BitCnt;
-
- retc=0;
- SCL0; //先将时钟线拉低
- SDAIN; /*置数据线为输入方式*/
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- SCL0; /*置时钟线为低,准备接收数据位*/
- delay(60); /*时钟低电平周期大于4.7μs*/
- SCL1; /*置时钟线为高使数据线上数据有效*/
- retc=retc<<1;
- if(SDADATA)
- retc=retc+1; /*读数据位,接收的数据位放入retc中 */
- delay(60);
- }
- SCL0; //从器件数据输了阶段在这一位后没有响应,数据线补外部上拉电阻临时拉为高
-
- delay(60);
- SDAOUT;
- return(retc);
-
- }
- /*******************************************************************
- 接口函数
- *******************************************************************/
- unsigned char ByteRead(unsigned int add,unsigned char *temp)
- {
- unsigned char rt;
- rt=0;
- Start_I2c(); /*启动总线*/
- if(SendByte(0xa0)) /*发送写命令*/
- rt=1;
- if(SendByte(add>>8)) //发送地址
- rt= 2;
- if(SendByte(add)) //发送地址
- rt= 3;
- Start_I2c(); /*启动总线*/
- if(SendByte(0xa1)) //发送读命令
- rt= 4;
-
- *temp=RcvByte();
-
- Stop_I2c(); /*结束总线*/
-
- return rt;
- }
- unsigned char ByteWrite(unsigned int add,unsigned char dat)
- {
- unsigned char rt;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
IIC_EEPROM_24LC64芯片与TMS320F2812完成读写操作.rar
(250.44 KB, 下载次数: 63)
|