TQ210 裸机测试 AT24C02A代码

来源:互联网 发布:配送软件app 编辑:程序博客网 时间:2024/06/16 23:48
#include <bsp.h>
#include <dbgserial.h>
#include "utils.h"
#include "I2C.h"

/* 映射内存*/

#define rGPD1CON   (*(volatile unsigned *)(BASE_REG_PA_GPIO+0xC0))
#define rGPD1DAT   (*(volatile unsigned *)(BASE_REG_PA_GPIO+0xC4))
#define rGPD1PUD   (*(volatile unsigned *)(BASE_REG_PA_GPIO+0xC8))

#define rI2CCON0 (*(volatile unsigned *)(BASE_REG_PA_I2C0+0X00))
#define rI2CCON2 (*(volatile unsigned *)(BASE_REG_PA_I2C2+0X00))


#define rI2CSTAT0 (*(volatile unsigned *)(BASE_REG_PA_I2C0+0X04))
#define rI2CSTAT2 (*(volatile unsigned *)(BASE_REG_PA_I2C2+0X04))


#define rI2CADD0 (*(volatile unsigned *)(BASE_REG_PA_I2C0+0X08))
#define rI2CADD2 (*(volatile unsigned *)(BASE_REG_PA_I2C2+0X08))


#define rI2CDS0 (*(volatile unsigned *)(BASE_REG_PA_I2C0+0X0C))
#define rI2CDS2 (*(volatile unsigned *)(BASE_REG_PA_I2C2+0X0C))


#define rI2CLC0 (*(volatile unsigned *)(BASE_REG_PA_I2C0+0X10))
#define rI2CLC2 (*(volatile unsigned *)(BASE_REG_PA_I2C2+0X10))


#define rAPLL_CON (*(volatile unsigned *)(BASE_REG_PA_CMU_CLK+0X100))
#define rMPLL_CON (*(volatile unsigned *)(BASE_REG_PA_CMU_CLK+0X108))
#define rCLK_SRC0 (*(volatile unsigned *)(BASE_REG_PA_CMU_CLK+0X200))
#define rCLK_DIV0 (*(volatile unsigned *)(BASE_REG_PA_CMU_CLK+0X300))
/*宏*/
#define IICTEST
#define CLEINTADDRESS (0XA0)
#define MASTERADDRESS (0X10)


#define WRDATA      (1)
#define POLLACK     (2)
#define RDDATA      (3)
#define SETRDADDR   (4)
#define IICBUFSIZE 0x20


static unsigned char iicSendData[IICBUFSIZE];
static unsigned char iiRecData[256]; //用于存储AT24C02读出的数据
static volatile int iicSendDataCount;
static volatile int iicStatus;
static volatile int iicMode;
static int iicPt;


static unsigned short ucPower = 0;


unsigned int GetPower()
{
ucPower+=10;
if(ucPower>100)
ucPower=10;
return ucPower;
}
void PowerI2C_Init(void)
{
Uart_SendByte('\r');  
Uart_SendByte('\n');  
Uart_SendByte('I');  
Uart_SendByte('2');  
Uart_SendByte('C');  
Uart_SendByte('_');  
Uart_SendByte('I');  
Uart_SendByte('n');  
Uart_SendByte('i');  
Uart_SendByte('t');  
Uart_SendByte('\n');  


#ifdef IICTEST
rGPD1CON = 0xffff22  ;   // SDA0
rGPD1PUD = 0x0; //UP_DOWN POWER DISABLE  Disables Pull-up/down
rI2CCON0 = ( (1<<7) | (1<<6) | (1<<5) | (0x3)) ;
rI2CADD0 = MASTERADDRESS; //写入自己的地址
 #else
  rGPD1CON  =  0x22ffff  ;   // SDA2
  rGPD1PUD  =  0X3ff;//UP_DOWN POWER DISABLE  Disables Pull-up/down
 #endif




 }


   
void Wr24C02(unsigned int slvAddr,unsigned int addr,unsigned char data);   
void Rd24C02(unsigned int slvAddr,unsigned int addr,unsigned char *data);  


void IicPoll(void);
void Run_IicPoll(void);




void Test_AT(void)
{
unsigned int i,j;


Uart_SendByte('W');
Uart_SendByte('\n');
for(i=0;i<256;i++)
Wr24C02(0xa0,(unsigned char)i,i+0X1);//写入数据到AT24C02

for(i=0;i<256;i++)//数组数据清零
iiRecData[i] = 0;


Uart_SendByte('R');
Uart_SendByte('\n');
for(i=0;i<256;i++)
Rd24C02(0xa0,(unsigned char)i,&(iiRecData[i]));//读取AT24C02的数据放入data数组中


for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
Uart_SendDWORD(iiRecData[i*16+j]);
Uart_SendByte(',');
}
Uart_SendByte("\n");
}
}


void Wr24C02(unsigned int slvAddr,unsigned int addr,unsigned char data) // slvAddr 为从地址
{   //addr为字节地址,data为写入的数据
iicMode      = WRDATA;  //写数据模式
iicPt        = 0;
iicSendData[0]   = (unsigned char)addr;
iicSendData[1]   = data;
iicSendDataCount = 2; //根据AT24C02字节写的发式,要写从地址和字节地址
    
rI2CDS0 = slvAddr;    //把0xa0地址写入到数据移位寄存器IICDS
//Master Tx mode, Start(Write), IIC-bus data output enable
//Bus arbitration sucessful, Address as slave status flag Cleared,
//Address zero status flag cleared, Last received bit is 0
rI2CSTAT0      = 0xf0; //     
//Clearing the pending bit isn't needed because the pending bit has been cleared.
while(iicSendDataCount!=-1)
Run_IicPoll();


iicMode = POLLACK;


while(1)
{
rI2CDS0     = slvAddr;
iicStatus = 0x100;             //To check if _iicStatus is changed 
rI2CSTAT0   = 0xf0;              //Master Tx, Start, Output Enable, Sucessful, Cleared, Cleared, 0
rI2CCON0    = 0xe3;              //Resumes IIC operation. 
while(iicStatus==0x100)  
Run_IicPoll();
              
if(!(iicStatus & 0x1))
break;                      //When ACK is received
}
rI2CSTAT0 = 0xd0;                    //Master Tx condition, Stop(Write), Output Enable
rI2CCON0  = 0xe3;                    //Resumes IIC operation. 
Delay(1);                           //Wait until stop condtion is in effect.
//Write is completed.
}
        
//************************[ _Rd24C02 ]********************************
void Rd24C02(unsigned int slvAddr,unsigned int addr,unsigned char *data)
{
iicMode      = SETRDADDR; //设置要从从机读取数据的从地址
iicPt        = 0;
iicSendData[0]   = (unsigned char)addr;
iicSendDataCount = 1;//写从地址


rI2CDS0   = slvAddr;
rI2CSTAT0 = 0xf0;                    //MasTx,Start  
//Clearing the pending bit isn't needed because the pending bit has been cleared.
while(iicSendDataCount!=-1)
Run_IicPoll();


iicMode      = RDDATA;//读数据模式
iicPt        = 0;
iicSendDataCount = 1;//
    
rI2CDS0   = slvAddr;
rI2CSTAT0 = 0xb0;                    //Master Rx,Start
rI2CCON0  = 0xe3;                    //Resumes IIC operation.   
while(iicSendDataCount!=-1)
Run_IicPoll();


*data = iicSendData[1];
}


void Run_IicPoll(void)
{
if(rI2CCON0 & 0x10)     // Tx/Rx 中断使能
IicPoll();
}       
   
void IicPoll(void)
{
unsigned int iicSt,i;
    
iicSt = rI2CSTAT0; //ICC状态寄存器
if(iicSt & 0x8){}   //总线仲裁失败  
if(iicSt & 0x4){}   //从地址与ICCADD地址匹配
if(iicSt & 0x2){}   //从地址为00000000b              
if(iicSt & 0x1){}   //未收到ACK                


switch(iicMode)
{
case POLLACK:
iicStatus = iicSt;
break;


case RDDATA: //从从机中读取数据
if((iicSendDataCount--)==0)
{
iicSendData[iicPt++] = rI2CDS0;
            
rI2CSTAT0 = 0x90;                //Stop MasRx condition 
rI2CCON0  = 0xe3;                //Resumes IIC operation.
Delay(1);                       //Wait until stop condtion is in effect.
                                                //Too long time... 
                                                //The pending bit will not be set after issuing stop condition.
break;    
}      
iicSendData[iicPt++] = rI2CDS0;
//The last data has to be read with no ack.
if((iicSendDataCount)==0)
rI2CCON0 = 0x2f;                 //Resumes IIC operation with NOACK.  
else 
rI2CCON0 = 0xe3;                 //Resumes IIC operation with ACK
break;


case WRDATA: //写数据到从机
if((iicSendDataCount--)==0)
{
rI2CSTAT0 = 0xd0;                //stop MasTx condition 
rI2CCON0  = 0xe3;                //resumes IIC operation.
Delay(1);                       //wait until stop condtion is in effect.
//The pending bit will not be set after issuing stop condition.
break;    
}
rI2CDS0 = iicSendData[iicPt++];        //iicSendData[0] has dummy.
for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL
rI2CCON0 = 0xe3;                     //resumes IIC operation.
break;


case SETRDADDR://设置要从从机机读取数据的从机地址
if((iicSendDataCount--)==0)
{
break;                  //IIC operation is stopped because of IICCON[4]    
}
rI2CDS0 = iicSendData[iicPt++];
for(i=0;i<10;i++);          //for setup time until rising edge of IICSCL
rI2CCON0 = 0xe3;             //resumes IIC operation.
break;


default:
break;      
}
}
0 0
原创粉丝点击