CC2430应用(一)-- AT24CXX的驱动程序 IIC 调试例程

来源:互联网 发布:养殖网络供销平台 编辑:程序博客网 时间:2024/04/29 03:41

    前几天记录了STM32关于IIC芯片PFC8563的驱动程序。后来发现之前的一个CC2430的用于读写EEPROM AT24CXX的程序。这个程序是使用的IO口模拟IIC数据传输逻辑。刚好可以弥补STM32中被硬件模块所替代的部分。具有一定的参考价值。

    这个例程和51之类的芯片例程最大的区别仅仅在于IO读写部分需要特别设置。用惯了MSP430类型MCU的人应该很容易理解

    不过这个程序没有经过高速读写测试,不知道性能极限是什么样子的。

 

例程:

 

iic_cc2430.h中的内容

 


#ifndef IIC_H
#define IIC_H

#define uint unsigned int
#define uchar unsigned char

#define  False  0
#define  True   1

#define Write_At24c512 0xa0
#define Read_At24c512  0xa1

void NOP(void);              //延时
void StartI2C(void);        //启动函数
void StopI2C(void);        //结束函数


void SendByte(unsigned char c);      //字节发送函数

unsigned char RevByte(void);         //字节接受函数

unsigned char WriteEeprom(unsigned char Write_Data);  //EEPROM数据写入函数

unsigned char ReadEeprom(void);   //EEPROM数据读出函数

void setaddr(unsigned int  addr);  //IIC地址转换函数

#endif

 

iic_cc2430.c文件的内容

 

// this is for IIC EEProm test

#include<ioCC2430.h>
#include "IIC.h"

#define FREQ 30//延时参数

unsigned char ack;//IIC 应答标志
unsigned char Write_Flag; 
unsigned char Read_Flag; 

unsigned char DATA_RETURN;
unsigned char ADDR_L;
unsigned char ADDR_H;


void _nop_()
{
    unsigned int nop;
    nop = FREQ;
    while(nop--);
}

void WriteSDA1(void)//SDA output 1
{
     P1DIR |= 0x40;
     P1_6 = 1;
}

void WriteSDA0(void)
{
     P1DIR |= 0x40;
     P1_6 = 0;
}

void WriteSCL1(void)
{
     P1DIR |= 0x80;
     P1_7 = 1;
}

void WriteSCL0(void)
{
     P1DIR |= 0x80;
     P1_7 = 0;
}

void ReadSDA(void)
{
     P1DIR &= 0xBF;
}

void setaddr(unsigned int  addr)
{

  ADDR_H = addr;///256;
 // ADDR_L = addr%256;//根据IIC芯片的具体内存地址
}

//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
void main(void)
{
  unsigned char i = 0x00;

  P1DIR = 0xff;
  P1 = 0;

  DATA_RETURN = 0x00;

  while(i<9)
  {
      setaddr(++i);
      WriteEeprom(i);
      NOP();
      DATA_RETURN = 0x00;
      setaddr(i);
      DATA_RETURN = ReadEeprom();
      NOP();


  }


  DATA_RETURN = 0x00;
  setaddr(0x4);
  DATA_RETURN = ReadEeprom();
  setaddr(0x2);
  DATA_RETURN = ReadEeprom();
  setaddr(0x7);
  DATA_RETURN = ReadEeprom();
  setaddr(0x6);
  DATA_RETURN = ReadEeprom();


}

////////////////////////////////////////////////////////
//  origion code
///////////////////////////////////////////////////////

void NOP(void)
{
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}

/*******************IIC启动函数************************/
void StartI2C(void)
{
 WriteSDA1();//发送起始条件数据信号
 WriteSCL1();
 
 _nop_();  //起始建立时间大于4.7us
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
  
 WriteSDA0(); //发送起始信号
 
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 
 WriteSCL0(); //钳位

        _nop_();
 _nop_();
  
}

/*************结束总线函数***************************/
void StopI2C(void)
{
 WriteSDA0(); //发送结束条件的数据信号
 _nop_();  //发送结束条件的时钟信号
 WriteSCL1(); //结束条件建立时间大于4us
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 WriteSDA1(); //发送I2C总线结束命令
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}
 
/*************字节数据传送函数************************/
void SendByte(unsigned char c)
{
 unsigned char BitCnt;
 
 for(BitCnt = 0;BitCnt < 8;BitCnt++)   //一个字节
 {
  if((c << BitCnt)& 0x80)
  {
   WriteSDA1(); //判断发送位
  }
  else 
  {
   WriteSDA0();
  }
   
  _nop_();
   
  WriteSCL1(); //时钟线为高,通知被控器开始接受数据
   
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  
  WriteSCL0();
 }
  
 _nop_();
 _nop_();
 WriteSDA1(); //释放数据线,准备接受应答位
 _nop_();
 _nop_();
 WriteSCL1();
 _nop_();
 _nop_();
 _nop_();

        P1DIR |= 0x00;

        _nop_();
        _nop_();
 
 if(P1_6 == 1) //判断DATA位是否有反馈
 {
  ack = 0x00;              //运行至此说明没有反馈
 }
 else
 {
  ack = 0x01;  //判断是否收到应答信号
 }
 
 
 
 WriteSCL0();
 _nop_();
 _nop_();
 _nop_();
 
}

/*************字节数据接收函数***************************/
unsigned char RevByte(void)
{
 unsigned char retc;
 unsigned char BitCnt;
 
 retc = 0;
 WriteSDA1();
 
 for(BitCnt=0;BitCnt<8;BitCnt++)
 {
  
  WriteSCL0(); //置时钟线为低,准备接收
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  WriteSCL1(); //置时钟线为高使得数据有效
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();

    ReadSDA();
  retc = retc << 1; //左移补零

    if(P1_6 == 1)
  {
   retc = retc + 1; //当数据为真加一
  }
 }
 
 WriteSCL0();
 _nop_();
 _nop_();
 
 return(retc);//返回接收数据
}

unsigned char WriteEeprom(unsigned char Write_Data)

 StartI2C();
 
 SendByte(Write_At24c512);
 
 if(ack == 1)
 {
         SendByte(ADDR_H);
  
  if(ack == 1)
  {
               //SendByte(ADDR_L);

                  //if(ack == 1)
   //{
                  SendByte(Write_Data);
               if(ack == 1)
               {
                  StopI2C();
                  _nop_();
                      return Write_Data;
               }  
   
   //}
  }
 }
 
 return 0xfe;
}

unsigned char ReadEeprom(void)
{
 
 unsigned char Read_Data;
 
 StartI2C();
  
 SendByte(Write_At24c512);
 
 if(ack == 1)
 {
 
       SendByte(ADDR_H);

  if(ack==1)
  {
   //SendByte(ADDR_L);

   //if(ack)
   //{
    StartI2C();
    SendByte(Read_At24c512);

    if(ack == 1)
    {
            Read_Data = RevByte();
         StopI2C();
         _nop_();
                                 return Read_Data;
    }
   //}
   }
  }
 
 
     return 0xfe;