我是靠谱客的博主 粗心砖头,最近开发中收集的这篇文章主要介绍【IoT】蓝牙BLE基础:CC254x通信系列之模拟IIC协议,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

CC254x 模拟 IIC:

1、基础宏定义

//P0_2  --- clk
//P0_3  --- data

#define SDA_IN         P0DIR &= ~BV(3); //SDA INPUT
#define SDA_OUT     P0DIR |= BV(3);  //SDA OUTPUT
#define SCL_IN          P0DIR &= ~BV(2); //SCL INPUT
#define SCL_OUT      P0DIR |= BV(2);  //SCL OUTPUT
#define ActiveTime()     (Delay5us())
#define SDA P0_3
#define SCL P0_2
#define SUCCESS 0
#define ERR -1

2、初始化

void iic_config_pin()
{
  P0SEL &= ~BV(2); //gpio   P0_2  
  P0SEL &= ~BV(3); //gpio   P0_3
  SDA_IN;
  SCL_IN;
}

3、基础函数

void Delay5us(void)
{ 
  unsigned short i;
  for(i=0;i<1;i++)
   asm("NOP");
}


void Delay1us(void)
{ 
  unsigned short i;
  for(i=0;i<0;i++)
   asm("NOP");
}

void Start(void)
{
  SDA_OUT; //开路输出
  SCL_OUT;
  
  SDA=1;
  Delay1us();
  SCL=1;
  ActiveTime();            //delya about 5us
  SDA=0;
  ActiveTime(); 
  SCL=0;
  ActiveTime(); 
}

void RepeatStart()          //without stop signal before
{
  SDA_OUT; //开路输出
  SCL_OUT;
  
  SDA=1;
  Delay1us();
  SCL=1;
  ActiveTime();            //delya about 5us
  SDA=0;
  ActiveTime(); 
  SCL=0;
  ActiveTime(); 
} 

void Stop(void)     //SCL高状态的时候,是有效的控制状态,然后通过SDA的翻转来表示启动和停止
{
  SDA_OUT; //开路输出
  SCL_OUT;
  
  SDA=0;
  Delay1us();
  SCL=1;
  ActiveTime();  
  SDA=1;
  ActiveTime(); 
  SCL=0;
  ActiveTime();
  
  SDA_IN;
  SCL_IN;
}

unsigned char ChkACK(void)  
{
  SDA_IN;
  SCL_OUT;

  ActiveTime();
  SCL=1;
  ActiveTime();
  if(!SDA)   
  {
   SCL=0;
   ActiveTime();
   return 0;
  }
  else
  {
   SCL=0;
   ActiveTime();
   return 1;
  }
}

void SendAck(void)
{ 
  SDA_OUT; //开路输出
  SCL_OUT;
  
  SDA=0;      
  Delay1us();
  SCL=1;
  ActiveTime();
  SCL=0;
  ActiveTime();
}

void SendNoAck(void)
{
  SDA_OUT; //开路输出
  SCL_OUT;
  
  SCL=0;
  ActiveTime();
  SDA=1;
  Delay1us();
  SCL=1;
  ActiveTime();
}

4、发送字节函数

void Send8bit(unsigned char AData)          //发送八位字节,先发送高位,在传输低位
{
  unsigned char i=8;
  SDA_OUT; //开路输出
  SCL_OUT;
  for(i=8; i>0;i--)                                     
  {
   if(AData&0x80)
    SDA=1;
   else
    SDA=0;
   Delay1us();
   SCL=1;
   ActiveTime();
   SCL=0;
   AData<<=1; 
   ActiveTime();                               
  }
}

5、读字节函数

unsigned char Read8bit(unsigned char ack)       //ack=1表示需要传输停止位,为0则表示不需要传输停止位
{
 unsigned char temp=0;
 unsigned char  i;
 unsigned char label;
 label=ack;
 
 SDA_IN; 
 SCL_OUT;
 
 Delay1us();
 for(i=8;i>0;i--)
 {
   ActiveTime();                                //保险起见,回头可以删掉
   SCL=1;
   ActiveTime();
   if(SDA)
    temp+=0x01;
   else
    temp&=0xfe;
   SCL=0;
   ActiveTime();
   if(i>1)
    temp<<=1;
  }
   if(label)
   { 
      SendAck();
   }
   else
   {
     SendNoAck();
   }                             //改成输出模式
  return temp;
}

6、写数据函数

unsigned char RegWrite(unsigned char address, unsigned char reg,unsigned char val)
{
  Start();                                  // Send Start
  Send8bit(address);                        // Send IIC "Write" Address
  if(ChkACK())
    return ERR;
  Send8bit(reg);                            // Send Register
  if(ChkACK())
    return ERR;
  Send8bit(val);                            // Send Value
  if(ChkACK())
    return ERR;
  Stop();                                   // Send Stop
  return SUCCESS;
}

unsigned char RegWriteN(unsigned char address, unsigned char reg1,unsigned char N,unsigned char *array)
{
  Start();                                  
  Send8bit(address);  
  if(ChkACK())
    return ERR;
  Send8bit(reg1);   
  if(ChkACK())
    return ERR;
  while (N>0)                  
  {
    Send8bit(*array);
    array++;
    N--;
    if(ChkACK())
     return ERR;
  }
  Stop();   
  return SUCCESS;
}

7、读数据函数

unsigned char RegRead(unsigned char address, unsigned char reg)             
{
  unsigned char  b;
  Start();                              
  Send8bit(address);    
  if(ChkACK())
   return ERR;
  Send8bit(reg);        
  if(ChkACK())
    return ERR;
  RepeatStart();                  //读取数据必须采用这种方式               
  Send8bit(address+1);            //重新发送设备地址位,并且该读写属性为读取
  if(ChkACK())
   return ERR;
  b=Read8bit(0);                                                  
  Stop();                            
  return b;
}


unsigned char RegReadN(unsigned char address, unsigned char reg1,unsigned char N,unsigned char *array)   
{
  unsigned char b;
  Start();                                  
  Send8bit(address);     
  if(ChkACK())
   return ERR;
  Send8bit(reg1);   
  if(ChkACK())
   return ERR;
  RepeatStart();                           
  Send8bit(address+1);    
  if(ChkACK())
   return ERR;              
  while (N>1)                                  
  {
    b =Read8bit(1);          //每一次读取都发送了确认位 
    *array = b;
    array++;
    N--;
  }
  b =Read8bit(0);            //最后一个接收的字节数据,不需要确认位(ACK)
  *array = b;                                   
  Stop();  
  return SUCCESS;
}

 

最后

以上就是粗心砖头为你收集整理的【IoT】蓝牙BLE基础:CC254x通信系列之模拟IIC协议的全部内容,希望文章能够帮你解决【IoT】蓝牙BLE基础:CC254x通信系列之模拟IIC协议所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部