![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 基于DSP240x的串行EEPROM的接口编程(2) | |||||
作者:61IC 文章来源:本站原创 点击数: 更新时间:2007-1-16 ![]() |
|||||
|
// I void STOP() { *PCDATDIR=*PCDATDIR&0X0FFDF; // SDA=0 delay(); *PCDATDIR=*PCDATDIR|0X0008; // SCL=1 delay( ); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR|0X0020; // SDA=1 } // 字节写子程序,即向I // 内容T_DATA。返回值为0时,代表操作成功;返回值为1时,代表操作失败 int BYTE_WR(BYTE_ADDR,T_DATA) int BYTE_ADDR,T_DATA; { int k; START(); // 启动I TRANSMIT(0X k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) TRANSMIT(BYTE_ADDR); // 送出地址 if(k==0) k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) TRANSMIT(T_DATA); // 送出需要保存的数据 if(k==0) k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) STOP(); // 设置停止状态 return(k); } // 接收一个字节子程序,出口为接收到的数据R_DATA int RECEIVE() { int R_DATA=0,sz,i; *PCDATDIR=*PCDATDIR&0X0DFFF; // 设置IOPC5(SDA)为输入 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 delay(); // 软件延时,以使时序匹配 for(i=0;i<8;i++) { R_DATA=R_DATA<<1; // R_DATA左移一位 *PCDATDIR=*PCDATDIR|0X0008; // SCL=1 delay(); // 软件延时,以使时序匹配 sz=*PCDATDIR&0X0020; // 取得相应的数据位 if(sz==0) R_DATA=R_DATA&0XFFFE; // 如果数据位为0,则R_DATA最低位清0 else R_DATA=R_DATA|0x0001; // 如果数据位为1,则R_DATA最低位置1 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 delay(); // 软件延时,以使时序匹配 } *PCDATDIR=*PCDATDIR|0X2000; // 设置IOPC5(SDA)为输出 return(R_DATA); // 返回接收的字节 } // 主机无应答信号子程序 void NO_ACK() { *PCDATDIR=*PCDATDIR|0X0008; // SCL=1 delay(); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 } // 主机应答子程序 void MASTER_ACK() { *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 *PCDATDIR=*PCDATDIR&0X0FFDF; // SDA=0 *PCDATDIR=*PCDATDIR|0X0008; // SCL=1 delay(); // 软件延时,以使时序匹配 *PCDATDIR=*PCDATDIR&0X0FFF7; // SCL=0 } // 字节读子程序,即从I // 为读出的数据R_DATA,通过C语言的参数传递功能实现。返回值为0X0FFFF时,表示操作失败; // 否则操作成功 int BYTE_RD(int BYTE_ADDR) { int k,R_DATA; START(); // 启动I TRANSMIT(0XA0); // 送出写控制字,以写入地址字节 k=SLAVE_ACK( ); // 从机(即PCF8583芯片)应答 if(k==0) TRANSMIT(BYTE_ADDR);// 送出需要读出数据的地址 k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) { START( ); // 启动I TRANSMIT(0XA1); } // 送出读控制字 k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) { R_DATA=RECEIVE(); // 接收PCF8583发出的数据 NO_ACK(); // 主机不作应答 STOP(); // 设置停止状态 } if(k==0) return(R_DATA); // 返回一个读出的数据 else return(0X0FFFF); // 如果整个读过程有误,则返回0X0FFFF } // 连续写子程序,入口为需要写的起始地址ADDR,存储需要写入数据的数组的首地址ARRY,需要 // 写入的数据的个数N int CON_WR(ADDR,ARRAY,N) int ADDR,*ARRAY,N; { int k; START(); // 启动I TRANSMIT(0X k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) TRANSMIT(ADDR); // 送出要写数据的起始地址 if(k==0) k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) { for(;N>0;N--,ARRAY++) { TRANSMIT(*ARRAY); // 送出需要保存的数据,保存在数组ARRAY中 k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答,地址自动加1 if(k==1) break; } } STOP(); // 设置停止状态 return(k); } // 连续读子程序,入口为需要读的起始地址ADDR,存储读出数据的数组首地址ARRY,需要读出的 // 数据的个数N int CON_RD(ADDR,ARRAY,N) int ADDR,*ARRAY,N; { int k,R_DATA; START(); // 启动I TRANSMIT(0XA0); // 送出写控制字,以写入地址字节 k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) TRANSMIT(ADDR); // 送出需要读出数据的地址 k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) { START(); // 启动I TRANSMIT(0XA1); } // 送出读控制字 k=SLAVE_ACK(); // 从机(即PCF8583芯片)应答 if(k==0) { for(;N>1;N--,ARRAY++) { R_DATA=RECEIVE(); // 接收PCF8583发出的数据 *ARRAY=R_DATA; // 读出的数据存入数组 MASTER_ACK(); // 主机应答,地址自动加1 } R_DATA=RECEIVE(); // 接收PCF8583发出的数据 *ARRAY=R_DATA; // 读出的数据存入数组 NO_ACK(); // 主机不作应答 STOP(); // 设置停止状态 } return(k); // k=0时表示操作成功,k=1时表示操作失败 } // 主程序 main() { int k; int R_DATA; static int source[6]={0x int result[6]; sysinit(); // 系统初始化 IOINIT(); // 输入输出口初始化 k=BYTE_WR(0x00,0x00); // 设置PCF8583的控制状态寄存器,其地址为0x00,值0x00代 // 表的意义请参考相关资料,若k==0,则证明写入成功;若k==1, // 则证明写入失败 R_DATA=BYTE_RD(0x00); // 读出地址单元0X00的值,如果读出值为0X0FFFF,则表示读 // 出值有误 k=CON_WR(0x30,source,6); // 从0x30地址开始连续写入6个数据 k=CON_RD(0x30,result,6); // 把写入的数据连续读出 } // 直接返回中断服务子程序 void interrupt nothing() { return; } |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|