概述
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协议所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复