原来写在其他地方的,现在转移到这个上面真痛苦,好多的图。后面每天会跟新一部分,让所有学习QI协议比较痛苦的小伙伴浪一下。数据包这一部分基本上就是对QI协议英文文档的归纳与总结,让大家对协议有一个大概的认识。上代码的时候也会好一些。毕竟英文文档大篇幅的看会很痛苦。 还有就是对其啥的真不会搞。。。。。。 数据包部分预计两天左右跟新完毕。后面会上传解码的源代码。同时也对无线充的原理图进行解析。能力有限,如有错误还希望大家指正。互相学习。目前本人无线充的项目完成度是完成数据解码。5W,10W,12W后续会都有涉及。为了大家能有一个讨论的话题。第一帖先贴一下我的解码程序。 代码的话排版也不是很好,可以复制下来贴到本地整理一下格式。代码是放在定时器里面的。
位编码的方案:
协议规定时钟信号的频率应该是Fclk = 2(4%)KHZ,所以每一位的传输时间约500us,如下图所示:
0:500us的高电平,或者500us的低电平
1:250us高电平+250us低电平,或者250us低电平+250us高电平
值得一提的是电源接收器负载的纹波会在电源发射机的电流上面产生纹波,这样的情况下,会出现比特错误,如果纹波的频率与调制频率相近,则比特错误数量会非常高。
字节编码方案
电源接收器应使用11位异步串行格式传输数据字节。
起始位:位:0
数据位:低位在前,高位在后
效验位:数据位偶数个1,校验位为1,数据位奇数个1,校验位为0
停止位:位:1
以0x35示例:
数据包格式(接收器给发射器)
数据包由4部分组成,:前导、页眉、消息和校验和。
前导位:数据包包括4个以上的前导位,每个位都为“1”
包头和数据部分在下面另外说明,内容比较多。
校验位:包头和数据部分进行异或处理
数据包格式(发射器给接收器)
数据包由4部分组成,:包头、消息和校验和。
包头和数据部分在下面另外说明,内容比较多。
校验位:包头和数据部分进行异或处理
响应结构:
ACK:承认,接受请求
NAK:不承认,拒绝请求
ND:未定义,无法识别或者无效请求
数据包长度:
由包头可以获得数据包的长度。
电源发射端接收的数据包
struct WireTime VoitTime = {0x00,0x00,0x00,0x00};
struct WireCode VoitCode = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0000};
unsigned char xdata VoitCodeBuf[Len] = {0x00};
void Tim3_Irt(void) interrupt T3_VECTOR
{
VoitTime.BitStu = 0x00;
if(WIREIO != VoitTime.PinOldStu)
{
if((VoitTime.Tclk >= TIM250MSDOWN)&&(VoitTime.Tclk <= TIM250MSUP))
{//'1'½ÓÊÕ£¬1ÓÉÁ¬ÐøÁ½´Î×é³É
if(VoitTime.LastClkStu)
{
VoitTime.LastClkStu = 0x00;
VoitTime.BitStu = 0x0C; //λ1
}
else VoitTime.LastClkStu = 0x01;
}
else if((VoitTime.Tclk >= TIM500MSDOWN)&&(VoitTime.Tclk <= TIM500MSUP))
{//'0'½ÓÊÕ,Èç¹û'1'½ÓÊÕµ½Ò»°ë¾ÍÊÕµ½0£¬ÄÇô¾ÍÐèÒªÆÁ±Îµô´íÎó'1'
if(VoitTime.LastClkStu)VoitTime.LastClkStu = 0x00;
VoitTime.BitStu = 0x03; //λ0
}
else
{
VoitTime.BitStu = 0x0E;
}
VoitTime.Tclk = 0x00;
VoitTime.PinOldStu = WIREIO;
}
else
{
if(VoitTime.Tclk < 10)VoitTime.Tclk ++;
}
switch(VoitTime.BitStu)
{
case 0x00://ûÓÐÊÕµ½Êý¾Ý
break;
case 0x0E://½ÓÊÕ´íÎó
memset(&VoitTime,0x00,sizeof(VoitTime));
memset(&VoitCode,0x00,sizeof(VoitCode));
break;
case 0x0C://×Ö½Ú'1'
if(VoitCode.CodeStep == 0x00)
{//Òýµ¼Âë
VoitCode.BitCnt ++;
}
else
{
VoitCode.BitCnt ++; //Êý¾ÝλÔö¼Ó'1'
VoitCode.ByteData = (VoitCode.ByteData >> 1) | 0x8000;
if(VoitCode.BitCnt == 11)
{//Êý¾Ý½ÓÊÕÍê±Ï
VoitCodeBuf[VoitCode.DataReceLen ++] = (unsigned char)((VoitCode.ByteData & 0x3FFF) >> 6);
if(VoitCode.DataReceLen == 0x02)
{
if(VoitCodeBuf[1] <= 0x1F) VoitCode.DataSetLen = (VoitCodeBuf[1] >> 5) + 1;
else if(VoitCodeBuf[1] <= 0x7F)VoitCode.DataSetLen = (VoitCodeBuf[1] >> 4);
else if(VoitCodeBuf[1] <= 0xDF)VoitCode.DataSetLen = (VoitCodeBuf[1] >> 3) - 8;
else VoitCode.DataSetLen = (VoitCodeBuf[1] >> 2) - 36;
VoitCode.DataSetLen += 0x03; //Êý¾Ý볤¶È + Ò»¸öÒýµ¼Î»£¬Ò»¸öЧÑé룬һ¸öÊý¾Ý°üÍ·
}
else if((VoitCode.DataReceLen == VoitCode.DataSetLen)&&(VoitCode.DataSetLen != 0x00))
{
Usart_SendArry(VoitCodeBuf,VoitCode.DataSetLen);
memset(VoitCodeBuf,0x00,VoitCode.DataSetLen);
memset(&VoitTime,0x00,sizeof(VoitTime));
memset(&VoitCode,0x00,sizeof(VoitCode));
}
VoitCode.BitCnt = 0x00;
}
}
break;
case 0x03://×Ö½Ú'0'
if((VoitCode.CodeStep == 0x00)&&(VoitCode.BitCnt >= 4))
{//Òýµ¼Âë
VoitCodeBuf[VoitCode.DataReceLen ++] = VoitCode.BitCnt;
VoitCode.BitCnt = 0x01; //Òýµ¼Âë¼ÆÊýÇå³ý£¬²¢½«Æðʼλ¼ÆÈë×Ö½ÚÊý¾Ý
VoitCode.CodeStep = 0x01; //Òýµ¼Âë½áÊø
}
else
{
VoitCode.ByteData >>= 1; //¶ÁÈëÊý¾Ýλ
VoitCode.BitCnt ++; //Êý¾ÝλÔö¼Ó'1'
}
break;
}
PINTF0 &=~ 0x02;
}
|
已解决,Tx和Rx不一样
大神开头 "协议规定时钟信号的频率应该是Fclk = 2(4%)KHZ,所以每一位的传输时间约500us,如下图所示" 我见协议写的是一个bit时长为 512周期,无线传输频率110K~205k,当为110k时一个bit时长约为500us 我理解的对吗 ?