打印

lPC2378 I2C程序

[复制链接]
2267|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
scardashu|  楼主 | 2010-8-22 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<nxp/iolpc2378.h>
#define STA (1<<5)
#define I2CEN (1<<6)
#define STO (1<<4)
#define SI (1<<3)
#define AA (1<<2)

#define WRMode 0 //写控制位
#define RDMode 1 //读控制位
#define C02MasterAddr 0xA0 //24c02的器件地址
#define C02SlaveAddr  0  //24c02的子地址
#define lastbyte         1   //最好一位标志位

typedef unsigned char euint8;
typedef unsigned int euint32;
        char j=1;
euint8 I2C_buf1[10];
euint8 I2C_buf2[10];
euint8 i;

/*延时函数*/
void  delayMs(euint32 dly)
{
        euint32 i;
        for(;dly>0;dly--)
        {
                for(i=0;i<1000;i++);
        }
}

/*I2C总线初始化*/
void I2C_Init(void)
{
//        PCONP |= ( 1 << 19);                         //功率寄存器使能
//        PINSEL1 |= ( 3 << 6 )|( 3 << 8 );                         //P0.19:SDA1   P0.20:SCL1
//        PINSEL1=0X03C0;
//        I21ADR = C02MasterAddr;
        I21SCLL =I21SCLH= 14;
        I21CONCLR=STA|SI|AA|STO;
        I21CONSET=I2CEN;
//        I21SCLL =I21SCLH= 14;
}

/*发送起始位*/
void I2C_Start(void)
{
    I21CONSET=STA;  //启动发送start脉冲
// I21CONSET=SI;   //发送完起始位会自动置1
    do{} while(0x08!=I21STAT);        //等待完成start脉冲发送
    I21CONCLR=STA;//清除STA位,结束过程               
}

/*发送停止位*/
void I2C_Stop(void)
{
        I21CONSET=STO;//启动发送stop自动清除
        I21CONSET=AA;
        I21CONCLR=SI;
}

/*写8位数据*/
void writebyte(euint8 data)
{
        I21DAT=data;
        I21CONSET=AA;
        I21CONCLR=SI;  //启动发送       
}

/*写数据*/
void writedata(euint8 data)
{
        writebyte(data);
        do{}  while(I21STAT!=0x28);// 等待写数据完成
}

/*写器件地址和读写信号*/
void writeAddr(euint8 ReadMode)
{
        writebyte(C02MasterAddr+ReadMode);
        if(ReadMode)
        {
            do{}while(I21STAT != 0X40);  //等待器件地址和读信号完成
        }
        else do{}while(I21STAT != 0x18);                          //等待器件地址和写信号完成
}

/*读8位数据*/
euint8 readbyte(euint8 last)                  //last:最后一位数据
{
        if(last)
        {
                I21CONCLR=AA;
                I21CONCLR=SI;                         //启动接受最后数据
                do {} while(I21STAT!=0X58);
        }
        else
        {
                I21CONSET=AA;
        //        I21CONSET=STO;
                I21CONCLR=SI;                          //启动接受数据
                do{} while(I21STAT!=0X50);
        }
        return I21DAT;
}

/*写四个字节到24c02*/
void writec02()
{
        euint8 i;
        
        I21CONCLR=STA|SI|AA|STO;
        I21CONSET=I2CEN;
        
        I2C_Start();
        writeAddr(WRMode);                                  //写地址和写模式
        writedata(C02SlaveAddr);                //23c02的存储地址
        for(i=0;i<4;i++) I2C_buf1[i]=i+5;       //I2C_buf初始化
        for(i=0;i<4;i++)
        {
                writedata(I2C_buf1[i]);
        }
        I2C_Stop();
        delayMs(100);         //延时等待EEPROM写操作
}       

/*从23c02地址读四个字节数据*/
void readc02()
{
        euint8 i;
        
        I21CONCLR=STA|SI|AA|STO;
        I21CONSET=I2CEN;
        
        I2C_Start();
        writeAddr(WRMode);
        writedata(C02SlaveAddr);
        I2C_Stop();
                                          
        I2C_Start();
        writeAddr(RDMode);      
        
        for(i=0;i<4;i++)  I2C_buf2[i]=0;
        for(i=0;i<3;i++)
        {
            I2C_buf2[i]=readbyte(!lastbyte);       
        }
        I2C_buf2[3]= readbyte(lastbyte);
        I2C_Stop();
}

/*主函数初始化*/
void sys_init(void)
{
         //使用GPIO功能,将所用的管脚连接到GPIO
         PINSEL0=0X00000000;
         PINSEL1=0X00000000;
         FIO2DIR=1<<13;
         
         FIO2SET=1<<13;
}

void delay (unsigned int n)
{
   while(n--);
}

void bell(void)
{
    sys_init();
    FIO2CLR=1<<13;
    delay(1000);
    FIO2SET=1<<13;         
}

void main()
{
        PINSEL1=0X000003C0;
        I2C_Init();       
        writec02();            //向24c02写4个字节数据
        delayMs(1000);
        readc02();                //从 24c02把写进去的数据读出来
        delayMs(1000);

        for(i=0;i<4;i++)
        {
                if(I2C_buf2[i]==I2C_buf1[i])
                 j=2;
        }
        while(j==2)         
        {
             bell();//蜂鸣器象
             delayMs(1000);
        }
}

大虾们看看程序有什么错误,开发环境是IAR,向ATC256里面写数据然后回读,但是结果不一样,期待求解……

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

1

粉丝