网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C2000 >> 文章正文
  基于DSP240x的串行EEPROM的接口编程(2)         ★★★ 【字体:
基于DSP240x的串行EEPROM的接口编程(2)
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-16    

// I2C停止子程序

void    STOP()

{

*PCDATDIR=*PCDATDIR&0X0FFDF    // SDA=0

delay()

*PCDATDIR=*PCDATDIR|0X0008         // SCL=1

delay( )                                // 软件延时,以使时序匹配

*PCDATDIR=*PCDATDIR|0X0020         // SDA=1

}

// 字节写子程序,即向I2C器件写1个字节的数据,入口为地址BYTE_ADDR和需要写入的字节

// 内容T_DATA。返回值为0时,代表操作成功;返回值为1时,代表操作失败

int  BYTE_WR(BYTE_ADDRT_DATA)

int  BYTE_ADDRT_DATA

{

int  k

START()                            // 启动I2C总线

TRANSMIT(0X0A0)                    // 送写控制字

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=0szi

*PCDATDIR=*PCDATDIR&0X0DFFF    // 设置IOPC5(SDA)为输入

*PCDATDIR=*PCDATDIR&0X0FFF7         // SCL=0

delay()                            // 软件延时,以使时序匹配 

for(i=0i<8i++) {

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

}

// 字节读子程序,即从I2C器件读出1个字节的数据,入口为需要读出的地址BYTE_ADDR,出口

// 为读出的数据R_DATA,通过C语言的参数传递功能实现。返回值为0X0FFFF时,表示操作失败;

// 否则操作成功

int  BYTE_RD(int  BYTE_ADDR)

{

int  kR_DATA

START()                        // 启动I2C总线

TRANSMIT(0XA0)                 // 送出写控制字,以写入地址字节

k=SLAVE_ACK( )                 // 从机(PCF8583芯片)应答

if(k==0) TRANSMIT(BYTE_ADDR)// 送出需要读出数据的地址

k=SLAVE_ACK()                  // 从机(PCF8583芯片)应答

if(k==0)  {

START( )                       // 启动I2C总线

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(ADDRARRAYN)

int   ADDR*ARRAYN

{

int  k

START()                        // 启动I2C总线

TRANSMIT(0X0A0)                // 送写控制字

k=SLAVE_ACK()                  // 从机(PCF8583芯片)应答

if(k==0) TRANSMIT(ADDR)  // 送出要写数据的起始地址

if(k==0) k=SLAVE_ACK()       // 从机(PCF8583芯片)应答

if(k==0) {

for(N>0N--ARRAY++)    {

TRANSMIT(*ARRAY) // 送出需要保存的数据,保存在数组ARRAY

k=SLAVE_ACK()        // 从机(PCF8583芯片)应答,地址自动加1

if(k==1) break

}

}

STOP()                         // 设置停止状态

return(k)

}

// 连续读子程序,入口为需要读的起始地址ADDR,存储读出数据的数组首地址ARRY,需要读出的

// 数据的个数N

int  CON_RD(ADDRARRAYN)

int   ADDR*ARRAYN

{

int  kR_DATA

START()                        // 启动I2C总线

TRANSMIT(0XA0)                 // 送出写控制字,以写入地址字节

k=SLAVE_ACK()                  // 从机(PCF8583芯片)应答

if(k==0) TRANSMIT(ADDR)       // 送出需要读出数据的地址

k=SLAVE_ACK()                  // 从机(PCF8583芯片)应答

if(k==0) {

START()                        // 启动I2C总线

TRANSMIT(0XA1)

}                                // 送出读控制字

k=SLAVE_ACK()                  // 从机(PCF8583芯片)应答

if(k==0) {

for(N>1N--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]={0x0F0x0E0x0D0x0C0x0B0x0A}

int       result[6] 

sysinit()                      // 系统初始化

IOINIT()                       // 输入输出口初始化

k=BYTE_WR(0x000x00) // 设置PCF8583的控制状态寄存器,其地址为0x00,值0x00

// 表的意义请参考相关资料,若k==0,则证明写入成功;若k==1

// 则证明写入失败

R_DATA=BYTE_RD(0x00) // 读出地址单元0X00的值,如果读出值为0X0FFFF,则表示读

// 出值有误

k=CON_WR(0x30source6) // 0x30地址开始连续写入6个数据  

k=CON_RD(0x30result6)  // 把写入的数据连续读出

}

//  直接返回中断服务子程序          

void interrupt nothing()

{

     return

}

 

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    基于DSP2407产生带死区的6个…
    DSP2407平台下用C语言实现的…
    利用DSP2407控制马达代码
    DSP2407控制320*240大液晶显…
    基于DSP240x的串行EEPROM的接…
    TMS320LF2407与图形液晶显示…
    一个基于DSP2407串行通信接口…
    基于DSP240x PWM波形产生举例
    基于DSP2407 CAN控制器的程序…
    DSP2407头文件和命令文件示例…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号