网站公告列表

  没有公告

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

串行EEPROM的接口编程

 24LC256的应用编程

// 该程序实现DSP2407EEPROM芯片24LC256的接口编程

#include      "register.h"

int       source[4]={4321}

int       result[4]

int       ncontrol

// 系统初始化子程序

void  sysinitial()

{

asm( " setc INTM ")                 // 关闭总中断

asm( " clrc SXM ")                  // 抑制符号扩展

asm( " clrc OVM ")                  // 累加器结果正常溢出

asm( " clrc CNF ")                  // B0被配置为数据空间

*SCSR1=0X81FE                  // CLKIN=6MCLKOUT=24M

*WDCR=0X0E8                // 不使能看门狗

*IMR=0X00                      // 禁止所有中断

WSGR=0x0FFFF               // 不使能所有的等待状态

}

// IO口初始化子程序

void  ioinitial()

{

*MCRB=*MCRB&0X0F6               // 选择定义IOPD0IOPC3IOPC0为通用I/O

*PCDATDIR=*PCDATDIR|0X0800     // IOPC3为输出

*PDDATDIR=*PDDATDIR|0X0100     // IOPD0为输出,且写允许

}

// 启动I2C总线子程序

void  I2CStart()

{

int  k

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

*PCDATDIR=*PCDATDIR|0X0100     // IOPC0(SDA为输出)

*PCDATDIR=*PCDATDIR|0X0009     // SDA=SCL=1

for(k=8k>=0k--) { k=k}               // 软件延时600ns

*PCDATDIR=*PCDATDIR&0x0FFFE         // SDA=0

for(k=8k>=0k--) { k=k}               // 软件延时600ns

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

for(k=18k>=0k--) { k=k}              // 软件延时1400ns

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

}

// I2C总线写入数据子程序

void  I2CSendByte(int  data)

{

int   flagszk                   // 定义局部寄存器  

*PCDATDIR=*PCDATDIR|0X0100     // 设置IOPC0为输出口

for(flag=0x0080flag!=0x00flag=flag/2)

{

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

for(k=0x06k>=0k--) {  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=0x016k>=0k--)  {  k=k}

}

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

}

// 检查应答位子程序

int  I2CRECACK()

{

int  k

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

for(k=16k>=0k--)    { k=k}           // 软件延时600ns

*PCDATDIR=*PCDATDIR|0X0008     // SCL=1,在SCL=1期间数据线上的状态必须保

// 持不变

for(k=3k>=0k--) {  k=k }         // 软件延时600ns

*PCDATDIR=*PCDATDIR&0x0FEFF         // IOPC0(SDA为输入)

for(k=3k>=0k--) {  k=k }        // 软件延时600ns

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

k=*PCDATDIR&0X01               // k值存储应答位,若K=0,则表示操作成功;

// k=1,则表示操作失败 

return(k)

}

// I2C总线读取数据

int  I2CRecByte()

{

int  k=0

int  flag

int  sz

*PCDATDIR=*PCDATDIR&0x0FEFF         // IOPC0(SDA为输入)

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

for(flag=0x0080flag!=0x00flag=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)

}

// I2C总线产生应答

void  I2CAck()

{

int  k

*PCDATDIR=*PCDATDIR|0X0100     // 设置IOPC0为输出口

*PCDATDIR=*PCDATDIR&0x0FFFE         // SDA=0

for(k=3k>0k--) {    k=k}        // 软件延时

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

for(k=7k>0k--) {    k=k}        // 软件延时

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

*PCDATDIR=*PCDATDIR|0X0001     // SDA=1,数据线恢复为1,但此时SCL=0SDA

// 后来可以改变

}

// 不对I2C总线产生应答

void  I2CNoAck()

{

*PCDATDIR=*PCDATDIR|0X0100     // 设置IOPC0为输出口

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

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

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

}

// 停止I2C总线

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=7k>0k--) {    k=k}        // 软件延时

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

for(k=7k>0k--) {    k=k}        // 软件延时

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

}

// 读数据子程序

int  read(arraycontroln)

int  *arraycontroln

{

int  dat

I2CStart()                               // 设置I2C总线的开始状态

I2CSendByte(control)                     // 送出控制字节(R/W=1

dat=I2CRECACK()                     // 检查应答位

if(dat==0){

for(n!=1n--array++)   {

dat=I2CRecByte()          // 读取一个字节的数据

I2CAck()                       // 产生应答信号

*array=dat                // 把读取的数据存入数组

}

dat=I2CRecByte()               // 接收最后一个字节的数据

I2CNoAck()                     // 不产生应答信号

*array=dat                     // 把读取的数据存入数组

dat=0x00                           // dat值赋0,表示前面的操作成功

}

return(dat)

}

// 写数据子程序

int     write(arraycontroln)

int  *arraycontroln

{

int  dat

*PDDATDIR=*PDDATDIR&0X0FFFE         // 设置写允许,WP=0

for(n!=0n--array++)    {   

I2CSendByte(*array)                // 写出一个字节数据

dat=I2CRECACK()

if(dat==1)    break                // 如果无应答位,则写数据失败,终止写操作

}

*PDDATDIR=*PDDATDIR|0X0001     // 写操作完成,设置写保护:WP=1

return(dat)

}

// 通用读写24LC256子程序,入口参数为输入/输出缓冲区首地址array

// 24LC256的块内地址adress,控制字节control,需要读写的字节数n

int  EEPROM(arrayadresscontroln)

int    *arrayadresscontroln      

{

int  dat

I2CStart()                          // 设置I2C总线的开始状态

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(arraycontroln)break// 调用读数据子程序

     case 0 dat=write(arraycontroln)break// 调用写数据子程序

              }

         }

     }

}

I2CStop()

return(dat)                              // 返回一个状态字,以确定操作是否成功

}

// 主程序

main()

{

     int  k

sysinitial()                            // 系统初始化

ioinitial()                             // io端口初始化

while(1)  {   

     k=EEPROM(source0x00000x00A04)

     if(k==0) break

}                                    // 如果写入成功,则终止写操作,否则继续写

for(k=0x20k>0k--)   {    k=k}

while(1)  {

     k=EEPROM(result0x000x00A14)

     if(k==0) break                // 如果读出成功,则终止读操作,否则继续读

}

}

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

void interrupt nothing()

{

     return

}

13.3  I2C串行日历时钟与TMS320LF2407的接口及应用

  源程序代码:

// 该程序实现对I2C总线日历时钟芯片PCF8583的读写操作

#include  "register.h"

// 系统初始化子程序

void sysinit()

{

     asm( " setc INTM ")            // 关闭总中断

     asm( " clrc SXM ")             // 抑制符号扩展

     asm( " clrc OVM ")             // 累加器结果正常溢出

     asm( " clrc CNF ")             // B0被配置为数据空间

     *SCSR1=0X81FE             // CLKIN=6MCLKOUT=24M

     *WDCR=0X0E8               // 不使能看门狗

     *IMR=0X00                 // 禁止所有中断

     *IFR=0X0FFFF              // 清除所有的中断标志

     WSGR=0x0FFFF              // 不使能所有的等待状态

}

// 输入输出口初始化子程序

void IOINIT()

{

*MCRB=*MCRB&0X0FFD7       // 配置IOPC3IOPC5为一般的I/O口方式

*PCDATDIR=*PCDATDIR|0X02828 // 配置IOPC3IOPC5为输出方式,且SCL=SDA=1

}

// 软件延时子程序

void delay()

{

int  i

for(i=0X07Di--)    {    i=i}

}

// 启动I2C总线子程序

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 flagsz                            // 定义需要的局部变量

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

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

for(flag=0x0080flag!=0x00flag=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    szk=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 
  • 上一篇文章:

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