打印

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

[复制链接]
64349|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


    原来写在其他地方的,现在转移到这个上面真痛苦,好多的图。后面每天会跟新一部分,让所有学习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;
    }









评论
zwc6658305 2020-9-7 16:24 回复TA
已解决,Tx和Rx不一样 
zwc6658305 2020-9-4 09:34 回复TA
大神开头 "协议规定时钟信号的频率应该是Fclk = 2(4%)KHZ,所以每一位的传输时间约500us,如下图所示" 我见协议写的是一个bit时长为 512周期,无线传输频率110K~205k,当为110k时一个bit时长约为500us 我理解的对吗 ? 

相关帖子

沙发
耗子小兵|  楼主 | 2018-4-22 16:29 | 只看该作者



使用特权

评论回复
评论
灵芝有人 2024-10-10 10:04 回复TA
博主群在那个帖子里,没有找到,可以发一下吗 
评分
参与人数 1威望 +3 收起 理由
liufabing + 3 很给力!
板凳
耗子小兵|  楼主 | 2018-4-22 16:30 | 只看该作者
发现还是图片格式来的快。。。。。

使用特权

评论回复
地板
一笑遥| | 2018-4-25 22:11 | 只看该作者
很详细,赞

使用特权

评论回复
5
huang1051| | 2018-5-8 15:33 | 只看该作者
正在研究

使用特权

评论回复
评论
耗子小兵 2018-5-20 16:33 回复TA
电路部分分析出来啊!可以去看看 
6
2018从新开始| | 2018-5-11 21:44 | 只看该作者
谢谢啊,我虽然看不明白但收藏学习了

使用特权

评论回复
7
ifxz0123| | 2018-5-18 14:04 | 只看该作者
楼主用的啥单片机写的?

使用特权

评论回复
评论
努力的瑾哒哒 2019-3-12 21:47 回复TA
楼主是什么单片机都可以吗? 
耗子小兵 2018-5-20 16:33 回复TA
无所谓拉!电路分析出来啊!可以去看看 
8
lovepanpanzhao| | 2018-5-22 15:29 | 只看该作者
楼主辛苦

使用特权

评论回复
9
chongdongchen| | 2018-5-23 09:17 | 只看该作者
感谢分享

使用特权

评论回复
10
qwertwuyu| | 2018-5-23 23:00 | 只看该作者
看不懂

使用特权

评论回复
11
adofe| | 2018-5-29 13:36 | 只看该作者
我也来研究一下,楼主辛苦了。

使用特权

评论回复
12
szlive| | 2018-6-21 19:21 | 只看该作者
楼主,有没有做个三星10w。

使用特权

评论回复
13
qwerhu| | 2018-6-22 14:24 | 只看该作者

使用特权

评论回复
14
耗子小兵|  楼主 | 2018-7-11 19:53 | 只看该作者
szlive 发表于 2018-6-21 19:21
楼主,有没有做个三星10w。

没做过但是知道怎么做

使用特权

评论回复
15
2018从新开始| | 2018-7-12 12:00 | 只看该作者
本帖最后由 2018从新开始 于 2018-7-12 12:02 编辑

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

使用特权

评论回复
评论
耗子小兵 2018-7-12 13:57 回复TA
是的!怎么了?? 
16
2018从新开始| | 2018-7-12 20:37 | 只看该作者
本帖最后由 2018从新开始 于 2018-7-12 20:43 编辑

上面写的数据位最长的是27那不超过了 ,我一直搞不清楚这个地方希望楼上的兄弟帮忙讲解一下,谢谢

使用特权

评论回复
评论
努力的瑾哒哒 2019-3-13 08:36 回复TA
你懂了吗兄弟 ,交流一下可以不? 
17
耗子小兵|  楼主 | 2018-7-13 10:11 | 只看该作者
2018从新开始 发表于 2018-7-12 20:37
上面写的数据位最长的是27那不超过了 ,我一直搞不清楚这个地方希望楼上的兄弟帮忙讲解一下,谢谢 ...

协议里面说的很清楚的!!小哥哥!!里面又计算数据包长度的公式!看我的第一篇**

使用特权

评论回复
18
2018从新开始| | 2018-7-13 12:15 | 只看该作者
我看好多次了,哈哈看来我比较笨还是搞不明白

使用特权

评论回复
19
耗子小兵|  楼主 | 2018-7-13 16:56 | 只看该作者
2018从新开始 发表于 2018-7-13 12:15
我看好多次了,哈哈看来我比较笨还是搞不明白

加一下第二篇的那个群吧!!我丢个代码给你

使用特权

评论回复
20
2018从新开始| | 2018-7-13 21:13 | 只看该作者
好的谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

93

帖子

50

粉丝