QI协议,无线充(一)数据包

[复制链接]
2619|23
 楼主 | 2018-4-20 22:31 | 显示全部楼层 |阅读模式


    原来写在其他地方的,现在转移到这个上面真痛苦,好多的图。后面每天会跟新一部分,让所有学习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:未定义,无法识别或者无效请求

    数据包长度:



                           由包头可以获得数据包的长度。


    电源发射端接收的数据包



    1. struct WireTime VoitTime = {0x00,0x00,0x00,0x00};
    2. struct WireCode VoitCode = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0000};

    3. unsigned char xdata VoitCodeBuf[Len] = {0x00};


    4. void Tim3_Irt(void) interrupt T3_VECTOR
    5. {
    6.         VoitTime.BitStu = 0x00;
    7.        
    8.         if(WIREIO != VoitTime.PinOldStu)
    9.         {
    10.                 if((VoitTime.Tclk >= TIM250MSDOWN)&&(VoitTime.Tclk <= TIM250MSUP))
    11.                 {//'1'½ÓÊÕ£¬1ÓÉÁ¬ÐøÁ½´Î×é³É
    12.                         if(VoitTime.LastClkStu)
    13.                         {
    14.                                 VoitTime.LastClkStu = 0x00;
    15.                                 VoitTime.BitStu = 0x0C;                                        //λ1
    16.                         }
    17.                         else VoitTime.LastClkStu = 0x01;
    18.                 }
    19.                 else if((VoitTime.Tclk >= TIM500MSDOWN)&&(VoitTime.Tclk <= TIM500MSUP))
    20.                 {//'0'½ÓÊÕ,Èç¹û'1'½ÓÊÕµ½Ò»°ë¾ÍÊÕµ½0£¬ÄÇô¾ÍÐèÒªÆÁ±Îµô´íÎó'1'
    21.                         if(VoitTime.LastClkStu)VoitTime.LastClkStu = 0x00;
    22.                         VoitTime.BitStu = 0x03;                                                //λ0
    23.                 }
    24.                 else
    25.                 {
    26.                         VoitTime.BitStu = 0x0E;
    27.                 }
    28.                 VoitTime.Tclk = 0x00;
    29.                 VoitTime.PinOldStu = WIREIO;
    30.         }
    31.         else
    32.         {
    33.                 if(VoitTime.Tclk < 10)VoitTime.Tclk ++;
    34.         }
    35.        
    36.         switch(VoitTime.BitStu)
    37.         {
    38.                 case 0x00://ûÓÐÊÕµ½Êý¾Ý
    39.                                                         break;
    40.                 case 0x0E://½ÓÊÕ´íÎó
    41.                                                         memset(&VoitTime,0x00,sizeof(VoitTime));
    42.                                                         memset(&VoitCode,0x00,sizeof(VoitCode));
    43.                                                         break;
    44.                 case 0x0C://×Ö½Ú'1'
    45.                                                         if(VoitCode.CodeStep == 0x00)
    46.                                                         {//Òýµ¼Âë
    47.                                                                 VoitCode.BitCnt ++;
    48.                                                         }
    49.                                                         else
    50.                                                         {
    51.                                                                 VoitCode.BitCnt ++;                                                        //Êý¾ÝλÔö¼Ó'1'
    52.                                                                 VoitCode.ByteData = (VoitCode.ByteData >> 1) | 0x8000;
    53.                                                                 if(VoitCode.BitCnt == 11)
    54.                                                                 {//Êý¾Ý½ÓÊÕÍê±Ï
    55.                                                                         VoitCodeBuf[VoitCode.DataReceLen ++] = (unsigned char)((VoitCode.ByteData & 0x3FFF) >> 6);
    56.                                                                         if(VoitCode.DataReceLen == 0x02)
    57.                                                                         {
    58.                                                                                 if(VoitCodeBuf[1] <= 0x1F) VoitCode.DataSetLen = (VoitCodeBuf[1] >> 5) + 1;
    59.                                                                                 else if(VoitCodeBuf[1] <= 0x7F)VoitCode.DataSetLen = (VoitCodeBuf[1] >> 4);
    60.                                                                                 else if(VoitCodeBuf[1] <= 0xDF)VoitCode.DataSetLen = (VoitCodeBuf[1] >> 3) - 8;
    61.                                                                                 else VoitCode.DataSetLen = (VoitCodeBuf[1] >> 2) - 36;
    62.                                                                                
    63.                                                                                 VoitCode.DataSetLen += 0x03;        //Êý¾Ý볤¶È + Ò»¸öÒýµ¼Î»£¬Ò»¸öЧÑé룬һ¸öÊý¾Ý°üÍ·
    64.                                                                         }
    65.                                                                         else if((VoitCode.DataReceLen == VoitCode.DataSetLen)&&(VoitCode.DataSetLen != 0x00))
    66.                                                                         {
    67.                                                                                 Usart_SendArry(VoitCodeBuf,VoitCode.DataSetLen);
    68.                                                                                 memset(VoitCodeBuf,0x00,VoitCode.DataSetLen);
    69.                                                                                 memset(&VoitTime,0x00,sizeof(VoitTime));
    70.                                                                                 memset(&VoitCode,0x00,sizeof(VoitCode));
    71.                                                                         }
    72.                                                                         VoitCode.BitCnt = 0x00;
    73.                                                                 }
    74.                                                         }
    75.                                                         break;
    76.                 case 0x03://×Ö½Ú'0'
    77.                                                         if((VoitCode.CodeStep == 0x00)&&(VoitCode.BitCnt >= 4))
    78.                                                         {//Òýµ¼Âë
    79.                                                                 VoitCodeBuf[VoitCode.DataReceLen ++] = VoitCode.BitCnt;
    80.                                                                 VoitCode.BitCnt         = 0x01;                                //Òýµ¼Âë¼ÆÊýÇå³ý£¬²¢½«Æðʼλ¼ÆÈë×Ö½ÚÊý¾Ý
    81.                                                                 VoitCode.CodeStep = 0x01;                                //Òýµ¼Âë½áÊø
    82.                                                         }
    83.                                                         else
    84.                                                         {
    85.                                                                 VoitCode.ByteData >>= 1;                                //¶ÁÈëÊý¾Ýλ
    86.                                                                 VoitCode.BitCnt ++;                                                        //Êý¾ÝλÔö¼Ó'1'
    87.                                                         }
    88.                                                         break;
    89.         }
    90.         PINTF0 &=~ 0x02;
    91. }
    复制代码









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2018-4-22 16:29 | 显示全部楼层



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1威望 +3 收起 理由
liufabing + 3 很给力!
 楼主 | 2018-4-22 16:30 | 显示全部楼层
发现还是图片格式来的快。。。。。
| 2018-4-25 22:11 | 显示全部楼层
很详细,赞
| 2018-5-8 15:33 | 显示全部楼层
正在研究

评论

耗子小兵 2018-5-20 16:33 回复TA
电路部分分析出来啊!可以去看看 
| 2018-5-11 21:44 | 显示全部楼层
谢谢啊,我虽然看不明白但收藏学习了
| 2018-5-18 14:04 | 显示全部楼层
楼主用的啥单片机写的?

评论

耗子小兵 2018-5-20 16:33 回复TA
无所谓拉!电路分析出来啊!可以去看看 
| 2018-5-22 15:29 | 显示全部楼层
楼主辛苦
| 2018-5-23 09:17 | 显示全部楼层
感谢分享
| 2018-5-23 23:00 | 显示全部楼层
看不懂
| 2018-5-29 13:36 | 显示全部楼层
我也来研究一下,楼主辛苦了。
| 2018-6-21 19:21 | 显示全部楼层
楼主,有没有做个三星10w。
| 2018-6-22 14:24 | 显示全部楼层
 楼主 | 2018-7-11 19:53 | 显示全部楼层
szlive 发表于 2018-6-21 19:21
楼主,有没有做个三星10w。

没做过但是知道怎么做
| 2018-7-12 12:00 | 显示全部楼层
本帖最后由 2018从新开始 于 2018-7-12 12:02 编辑

这个数据是多少位啊,大神们从B0-B4也就是5个8位的长度也该是40,我是个菜鸟希望楼上的不要笑话我

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评论

耗子小兵 2018-7-12 13:57 回复TA
是的!怎么了?? 
| 2018-7-12 20:37 | 显示全部楼层
本帖最后由 2018从新开始 于 2018-7-12 20:43 编辑

上面写的数据位最长的是27那不超过了 ,我一直搞不清楚这个地方希望楼上的兄弟帮忙讲解一下,谢谢
 楼主 | 2018-7-13 10:11 | 显示全部楼层
2018从新开始 发表于 2018-7-12 20:37
上面写的数据位最长的是27那不超过了 ,我一直搞不清楚这个地方希望楼上的兄弟帮忙讲解一下,谢谢 ...

协议里面说的很清楚的!!小哥哥!!里面又计算数据包长度的公式!看我的第一篇文章
| 2018-7-13 12:15 | 显示全部楼层
我看好多次了,哈哈看来我比较笨还是搞不明白
 楼主 | 2018-7-13 16:56 | 显示全部楼层
2018从新开始 发表于 2018-7-13 12:15
我看好多次了,哈哈看来我比较笨还是搞不明白

加一下第二篇的那个群吧!!我丢个代码给你
| 2018-7-13 21:13 | 显示全部楼层
好的谢谢
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /5 下一条

快速回复 返回顶部 返回列表