原创 基于ZigBee CC2530 EEPROM(24CXX)驱动程序

2014-6-27 16:02 12363 22 26 分类: 工程师职场 文集: ZIGBEE部分

今天上午在做无线通信部分用到了小数据量的存储,临时写了一个小驱动,用起来还行。

/**********************************/
//作者:孙金刚
//时间:2013年7月4日
//功能:EEPROM 24CXX驱动。
//入口函数:WriteSet(0x00,0x0f);   //在指定地址“0x00”中写入数据“0x0f”
//     P0=ReadSet(0x01);      //从指定地址“0x01中读取数据
/**********************************/
#include       
#include

#define SDA P1_3             //将串行数据总线SDA位定义在为P1.3引脚
#define SCL P1_7             //将串行时钟总线SDA位定义在为P1.7引脚

/*****************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
   unsigned char i,j; 
  for(i=0;i<100;i++)
   for(j=0;j<10;j++)
          { 
   asm("NOP");
          asm("NOP");
          asm("NOP"); 
          }
 }

/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
 void delaynms(unsigned char n)
 {
   unsigned char i;
 for(i=0;i     delay1ms();
 }
/***************************************************
函数功能:开始数据传送
***************************************************/
void start()
// 开始位
{      
        P1DIR |= 0x88;
        P1SEL &= 0x77;
 SDA = 1;       //SDA初始化为高电平“1”
        asm("NOP");    //等待一个机器周期
 asm("NOP");  
 asm("NOP");   
        asm("NOP");   
 asm("NOP");  
 asm("NOP");   
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
        SCL = 1;       //开始数据传送时,要求SCL为高电平“1”
 asm("NOP");    //等待一个机器周期
 asm("NOP");   
 asm("NOP");   
 asm("NOP");   
        asm("NOP");  
 asm("NOP");  
 asm("NOP");   
 asm("NOP");   
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
 asm("NOP");   
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
       
 SDA = 0;    //SDA的下降沿被认为是开始信号
 asm("NOP");    //等待一个机器周期
 asm("NOP");   
 asm("NOP");   
 asm("NOP");   
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
 asm("NOP");   
        asm("NOP");   
 asm("NOP");  
 asm("NOP");   
 asm("NOP");   
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
 
 SCL = 0;    //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) 
}
/***************************************************
函数功能:结束数据传送
***************************************************/
void stop()
// 停止位
{
        P1DIR |= 0x88;
 SDA = 0;        //SDA初始化为低电平“0” _n
        asm("NOP");     //等待一个机器周期
 asm("NOP");    
 asm("NOP");   
        asm("NOP");   
 asm("NOP");    
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");    
 SCL = 1;        //结束数据传送时,要求SCL为高电平“1”
 asm("NOP");     //等待一个机器周期
 asm("NOP");    
 asm("NOP");    
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");    
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");    
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");    
 SDA = 1;        //SDA的上升沿被认为是结束信号
 asm("NOP");     //等待一个机器周期
 asm("NOP");    
 asm("NOP");    
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");    
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");   
 asm("NOP");    
        asm("NOP");    
 asm("NOP");    
 asm("NOP");    
 SDA=0;
 SCL=0;
}
/***************************************************
函数功能:从AT24Cxx读取数据
出口参数:x
***************************************************/
unsigned char ReadData()
// 从AT24Cxx移入数据到MCU
{
        P1DIR &= ~0x08;
 unsigned char i;
 unsigned char x;                //储存从AT24Cxx中读出的数据
 for(i = 0; i < 8; i++)
 {
  SCL = 1;                //SCL置为高电平
  x<<=1;                  //将x中的各二进位向左移一位
  x|=(unsigned char)SDA;  //将SDA上的数据通过按位“或“运算存入x中
  SCL = 0;                        //在SCL的下降沿读出数据
 }
 return(x);                      //将读取的数据返回
}
/***************************************************
函数功能:向AT24Cxx的当前地址写入数据
入口参数:y (储存待写入的数据)
***************************************************/
//在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0
bool WriteCurrent(unsigned char y)
{
        P1DIR |= 0x88;
 unsigned char i;
 bool ack_bit;             //储存应答位
 for(i = 0; i < 8; i++)   // 循环移入8个位
 {
       SDA = (bool)(y&0x80);   //通过按位“与”运算将最高位数据送到S
                    //因为传送时高位在前,低位在后
   asm("NOP");             //等待一个机器周期 
          asm("NOP");            
   asm("NOP");            
   asm("NOP");            
   asm("NOP");            
   SCL = 1;                //在SCL的上升沿将数据写入AT24Cxx     
      asm("NOP");             
   asm("NOP");         
          asm("NOP");   
   asm("NOP");   
   asm("NOP");   
   asm("NOP");   
  
   SCL = 0;            //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
   y <<= 1;            //将y中的各二进位向左移一位
 }
 SDA = 1;              // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
                       //以让SDA线转由接收设备(AT24Cxx)控制
 asm("NOP");           //等待一个机器周期
 asm("NOP");          
        asm("NOP");   
 asm("NOP");   
 asm("NOP");  
 asm("NOP");   
 SCL = 1;              //根据上述规定,SCL应为高电平
 asm("NOP");           //等待一个机器周期
 asm("NOP");       
 asm("NOP");       
 asm("NOP");       
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
 asm("NOP");   
        asm("NOP");   
 asm("NOP");   
 asm("NOP");   
 asm("NOP");   
 ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
                //若送高电平,表示没有接收到,传送异常
 SCL = 0;       //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
        return  ack_bit;   // 返回AT24Cxx应答位
}
/***************************************************
函数功能:向AT24Cxx中的指定地址写入数据
入口参数:add (储存指定的地址);dat(储存待写入的数据)
***************************************************/
void WriteSet(unsigned char add, unsigned char dat)
// 在指定地址addr处写入数据WriteCurrent
{
       
 start();                 //开始数据传递
 WriteCurrent(OP_WRITE);  //选择要操作的AT24Cxx芯片,并告知要对其写入数据
 WriteCurrent(add);       //写入指定地址
 WriteCurrent(dat);       //向当前地址(上面指定的地址)写入数据
 stop();                  //停止数据传递
 delaynms(4);          //1个字节的写入周期为1ms, 最好延时1ms以上
}
/***************************************************
函数功能:从AT24Cxx中的当前地址读取数据
出口参数:x (储存读出的数据)
***************************************************/
unsigned char ReadCurrent()
{
 unsigned char x;
 start();                 //开始数据传递
 WriteCurrent(OP_READ);   //选择要操作的AT24Cxx芯片,并告知要读其数据
 x=ReadData();            //将读取的数据存入x
 stop();                  //停止数据传递
 return x;                //返回读取的数据
}
/***************************************************
函数功能:从AT24Cxx中的指定地址读取数据
入口参数:set_addr
出口参数:x
***************************************************/
unsigned char ReadSet(unsigned char set_addr)
// 在指定地址读取
{
 start();                      //开始数据传递
 WriteCurrent(OP_WRITE);       //选择要操作的AT24Cxx芯片,并告知要对其写入数据
 WriteCurrent(set_addr);       //写入指定地址
 return(ReadCurrent());        //从指定地址读出数据并返回
}

 

 

 

 

 

文章评论4条评论)

登录后参与讨论

vinisi_500889281 2015-6-23 08:18

印制线的阻抗主要由在频率大于数千赫兹以上时的电感决定的,减小地连接阻抗的方法有两种: (1) 使导线的长度最短,并且如果可能,增加它的长度;----此句意思?应该是“增加它的宽度”吧!

用户1836147 2015-4-28 09:24

很好

用户208819 2014-11-19 23:30

非常有用。只是缺少了两个宏定义。

用户424652 2013-8-7 08:00

C语言的基本语法。

村下春树 2013-8-6 14:09

楼主,请教你那个OP_READ和OP_WRITE是在哪定义的?什么意思?
相关推荐阅读
用户424652 2014-09-27 13:09
3D打印前奏GCode代码(1)基本指令
GCode代码指令头: Gnnn:标准GCode命令,例如移动到一个坐标点。 Mnnn:RepRap定义的命令,例如打开一个冷却风扇。 Tnnn:选择工具代码nnn,在RepRap中,...
用户424652 2014-07-09 11:15
无线通信比较(1)
之前一直在研究ZigBee通信,眼下正要开发新的产品,顺势研究一下市面上的无线通信的方式。433MHz是一个开放的载波频段,比ZigBee通信有着更好的穿透性,很多工业场合使用该载波频段为载体进行...
用户424652 2014-06-30 09:08
时间常数(2)
对于电路时间常数RC的计算,归纳如下: 1、如果RC电路中的电源是电压源形式,先把电源“短路”而保留其串联内阻; 2、把去掉电源后的电路简化成一个等效电阻R和等效电容C串联的RC放电回路,...
用户424652 2014-06-28 16:24
OpenCV(2)
       新版本的OpenCV加入FaceRecognizer类,用于进行人脸识别,支持Eigenfaces、Fisherface、Local Binary Patterns Hisogram...
用户424652 2014-06-28 16:23
时间常数(1)
        时间常数:表示过度反应的时间过程的常数。指该物理量达到最大值的1/e所需要的时间。          电路中的时间常数:表示过度反应的时间过程常数。在电阻、电容的电路中,它是电...
用户424652 2014-06-27 16:27
STM32系列命名
STM32系列命名规则 STM32 F 103 C 6 T 7 xxx       1 2 3 4 5 6 7 8   第1部分:产品系列名,固定为STM32   第2部分:产品类型;F...
我要评论
4
22
关闭 站长推荐上一条 /2 下一条