![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 基于DSP240x的串行EEPROM的接口编程(1) | |||||
作者:61IC 文章来源:本站原创 点击数: 更新时间:2007-1-16 ![]() |
|||||
|
串行EEPROM的接口编程 24LC256的应用编程 // 该程序实现DSP2407与EEPROM芯片24LC256的接口编程 #include "register.h" int source[4]={4,3,2,1}; int result[4]; int n,control; // 系统初始化子程序 void sysinitial() { asm( " setc INTM "); // 关闭总中断 asm( " clrc SXM ") ; // 抑制符号扩展 asm( " clrc OVM ") ; // 累加器结果正常溢出 asm( " clrc CNF ") ; // B0被配置为数据空间 *SCSR1=0X81FE; // CLKIN= *WDCR=0X0E8; // 不使能看门狗 *IMR=0X00; // 禁止所有中断 WSGR=0x0FFFF; // 不使能所有的等待状态 } // IO口初始化子程序 void ioinitial() { *MCRB=*MCRB&0X *PCDATDIR=*PCDATDIR|0X0800; // IOPC3为输出 *PDDATDIR=*PDDATDIR|0X0100; // IOPD0为输出,且写允许 } // 启动I void I2CStart() { int k; *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 *PCDATDIR=*PCDATDIR|0X0100; // IOPC0(SDA为输出) *PCDATDIR=*PCDATDIR|0X0009; // SDA=SCL=1 for(k=8;k>=0;k--) { k=k;} // 软件延时600ns *PCDATDIR=*PCDATDIR&0x0FFFE; // SDA=0 for(k=8;k>=0;k--) { k=k;} // 软件延时600ns *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 for(k=18;k>=0;k--) { k=k;} // 软件延时1400ns *PCDATDIR=*PCDATDIR|0X0001; // SDA=1 } // 向I void I2CSendByte(int data) { int flag,sz,k; // 定义局部寄存器 *PCDATDIR=*PCDATDIR|0X0100; // 设置IOPC0为输出口 for(flag=0x0080;flag!=0x00;flag=flag/2) { *PCDATDIR=*PCDATDIR&0X0FFF7;// SCL=0 for(k=0x06;k>=0;k--) { k=k;} sz=data&flag; // 屏蔽掉相应的位 if(sz==0) *PCDATDIR=*PCDATDIR&0X0FFFE;// 如果相应的位为0,则SDA=0 else *PCDATDIR=*PCDATDIR|0x0001; // 如果相应的位为1,则SDA=1 *PCDATDIR=*PCDATDIR|0X0008;// SCL=1,在SCL=1期间数据线上的状态必须保持不变 for(k=0x016;k>=0;k--) { k=k;} } *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 } // 检查应答位子程序 int I2CRECACK() { int k; *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 for(k=16;k>=0;k--) { k=k;} // 软件延时600ns *PCDATDIR=*PCDATDIR|0X0008; // SCL=1,在SCL=1期间数据线上的状态必须保 // 持不变 for(k=3;k>=0;k--) { k=k; } // 软件延时600ns *PCDATDIR=*PCDATDIR&0x0FEFF; // IOPC0(SDA为输入) for(k=3;k>=0;k--) { k=k; } // 软件延时600ns *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 k=*PCDATDIR&0X01; // k值存储应答位,若K=0,则表示操作成功; // 若k=1,则表示操作失败 return(k); } // 从I int I2CRecByte() { int k=0; int flag; int sz; *PCDATDIR=*PCDATDIR&0x0FEFF; // IOPC0(SDA为输入) *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 for(flag=0x0080;flag!=0x00;flag=flag/2) { *PCDATDIR=*PCDATDIR|0X0008; // SCL=1 sz=*PCDATDIR&flag; // 取得应该读取的相应位 if(sz==flag) k=k|flag; // 若读取的相应位为1,则k值的相应位置1 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 } return(k); } // 对I void I2CAck() { int k; *PCDATDIR=*PCDATDIR|0X0100; // 设置IOPC0为输出口 *PCDATDIR=*PCDATDIR&0x0FFFE; // SDA=0 for(k=3;k>0;k--) { k=k;} // 软件延时 *PCDATDIR=*PCDATDIR|0X0008; // SCL=1 for(k=7;k>0;k--) { k=k;} // 软件延时 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 *PCDATDIR=*PCDATDIR|0X0001; // SDA=1,数据线恢复为1,但此时SCL=0,SDA在 // 后来可以改变 } // 不对I void I2CNoAck() { *PCDATDIR=*PCDATDIR|0X0100; // 设置IOPC0为输出口 *PCDATDIR=*PCDATDIR|0X0001; // SDA=1 *PCDATDIR=*PCDATDIR|0X0008; // SCL=1 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 } // 停止I void I2CStop() { int k; *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 *PCDATDIR=*PCDATDIR|0X0100; // 设置IOPC0为输出口 *PCDATDIR=*PCDATDIR&0x0FFFE; // SDA=0 *PCDATDIR=*PCDATDIR|0X0008; // SCL=1 for(k=7;k>0;k--) { k=k;} // 软件延时 *PCDATDIR=*PCDATDIR|0x0001; // SDA=1 for(k=7;k>0;k--) { k=k;} // 软件延时 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 } // 读数据子程序 int read(array,control,n) int *array,control,n; { int dat; I2CStart(); // 设置I I2CSendByte(control); // 送出控制字节(R/W=1) dat=I2CRECACK(); // 检查应答位 if(dat==0){ for(;n!=1;n--,array++) { dat=I2CRecByte(); // 读取一个字节的数据 I2CAck(); // 产生应答信号 *array=dat; // 把读取的数据存入数组 } dat=I2CRecByte(); // 接收最后一个字节的数据 I2CNoAck(); // 不产生应答信号 *array=dat; // 把读取的数据存入数组 dat=0x00; // dat值赋0,表示前面的操作成功 } return(dat); } // 写数据子程序 int write(array,control,n) int *array,control,n; { int dat; *PDDATDIR=*PDDATDIR&0X0FFFE; // 设置写允许,WP=0 for(;n!=0;n--,array++) { I2CSendByte(*array); // 写出一个字节数据 dat=I2CRECACK(); if(dat==1) break; // 如果无应答位,则写数据失败,终止写操作 } *PDDATDIR=*PDDATDIR|0X0001; // 写操作完成,设置写保护:WP=1 return(dat); } // 通用读写24LC256子程序,入口参数为输入/输出缓冲区首地址array, // 24LC256的块内地址adress,控制字节control,需要读写的字节数n int EEPROM(array,adress,control,n) int *array,adress,control,n; { int dat; I2CStart(); // 设置I dat=control&0x0FFFE; // 清除控制字节的第0位 I2CSendByte(dat); // 送出控制字节(R/W=0) dat=I2CRECACK(); // 检查应答位 if(dat==0) { dat=adress&0x0FF00; dat=dat>>8; // dat=24LC256的块内地址的高字节 I2CSendByte(dat); // 送出24LC256的块内地址的高字节 dat=I2CRECACK(); // 检查应答位 if(dat==0) { dat=adress&0x00FF; I2CSendByte(dat); // 送出24LC256的块内地址的低字节 dat=I2CRECACK(); // 检查应答位 if(dat==0) { dat=control&0x0001; switch(dat) { case 1 :dat=read(array,control,n);break;// 调用读数据子程序 case 0 :dat=write(array,control,n);break;// 调用写数据子程序 } } } } I2CStop(); return(dat); // 返回一个状态字,以确定操作是否成功 } // 主程序 main() { int k; sysinitial(); // 系统初始化 ioinitial(); // io端口初始化 while(1) { k=EEPROM(source,0x0000,0x if(k==0) break; } // 如果写入成功,则终止写操作,否则继续写 for(k=0x20;k>0;k--) { k=k;} while(1) { k=EEPROM(result,0x00,0x if(k==0) break; // 如果读出成功,则终止读操作,否则继续读 } } // 直接返回中断服务子程序 void interrupt nothing() { return; } 13.3 I 源程序代码: // 该程序实现对I #include "register.h" // 系统初始化子程序 void sysinit() { asm( " setc INTM "); // 关闭总中断 asm( " clrc SXM ") ; // 抑制符号扩展 asm( " clrc OVM ") ; // 累加器结果正常溢出 asm( " clrc CNF ") ; // B0被配置为数据空间 *SCSR1=0X81FE; // CLKIN= *WDCR=0X0E8 ; // 不使能看门狗 *IMR=0X00; // 禁止所有中断 *IFR=0X0FFFF; // 清除所有的中断标志 WSGR=0x0FFFF; // 不使能所有的等待状态 } // 输入输出口初始化子程序 void IOINIT() { *MCRB=*MCRB&0X0FFD7; // 配置IOPC3和IOPC5为一般的I/O口方式 *PCDATDIR=*PCDATDIR|0X02828; // 配置IOPC3和IOPC5为输出方式,且SCL=SDA=1 } // 软件延时子程序 void delay() { int i; for(i=0X07D;i--;) { i=i;} } // 启动I void START() { *PCDATDIR=*PCDATDIR|0X028; // SDA=SCL=1 delay( ); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR&0X0FFDF; // SDA=0 delay(); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 delay(); // 软件延时,以使时序匹配 } // 发送字节子程序 void TRANSMIT(TRAN) int TRAN; { int flag,sz; // 定义需要的局部变量 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 delay(); // 软件延时,以使时序匹配 for(flag=0x0080;flag!=0x00;flag=flag/2) { sz=TRAN&flag; // 屏蔽掉不需要的位 if(sz==0) *PCDATDIR=*PCDATDIR&0X0FFDF;// 如果相应的位为0,则SDA=0 else *PCDATDIR=*PCDATDIR|0X020;// 如果相应的位为1,则SDA=1 delay(); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR|0X08; // SCL=1 delay(); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 delay(); // 软件延时,以使时序匹配 } } // 从机(即PCF8583芯片)应答子程序。返回值为0时,代表操作成功;返回值为1时,代表操作失败 int SLAVE_ACK() { int sz,k=0; // 定义所需要的局部变量 *PCDATDIR=*PCDATDIR|0X0020; // SDA=1 delay(); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR&0X0DFFF; // 设置IOPC5(SDA)为输入 delay(); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR|0X08; // SCL=1 delay(); // 软件延时,以使时序匹配 sz=*PCDATDIR&0X0020; // 检测数据位 if(sz==0X0020) k=1; // 如果数据位为1,则证明失败,则令k=1 else k=0; // 如果数据位为0,则证明成功,则保持k=0不变 *PCDATDIR=*PCDATDIR|0X2000; // 设置IOPC5(SDA)为输出 *PCDATDIR=*PCDATDIR&0X0FFD7; // SCL=SDA=0 return(k); } |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|