阅读:2889回复:0

NEC码的一些说明

楼主#
更多 发布于:2021-12-25 09:50
NEC码由引导码,地址码,地址反码,命令码以及命令反码组成
每个的名字又有很多种叫法:
引导码:码头
地址码:用户码
命令:指令码、数据码...
光名字还没看完就头晕


引导码:9ms高电平+4.5ms低电平
地址码和命令码由0和1二进制组成的1位16进制数字,0由560us高电平+560低电平 组成,1由560us高电平+1690us低电平组成
有的场景以上的高低电平会反过来


android上的红外输入不多解释,遥控一按,getevent看得明明白白


amlogic在bootloader和kernel里都集成了红外输出,bootloader里的调试方法:在串口下输入irblaster就可以查看帮助


irblaster openirblaster send yourCode
irblaster close
标准的三步曲


不过还是有些细节需要注意,比如地址码为08,命令码为1E,如果需要在串口下输出这个IR码,要按下面的计算:
08补码:7F, 1E补码:E1,按格式:地址码-地址反码-命令码-命令反码从低位到高位拼接:
0001(8) 0000(0) 1110(7) 1111(F)0111(E) 1000 (1) 1000(1) 0111 (E)
但如果直接把这个数字send,肯定是不行的
get_nec_data函数对send传进来的数值进行了转换:

       for (index = 0; index < 32; index++) {
 if (value & (0x01 << index)) {
 pdata[num++] = NEC_ONE[0];
 pdata[num++] = NEC_ONE[1];
 } else {
 pdata[num++] = NEC_ZERO[0];
 pdata[num++] = NEC_ZERO[1];
 }
 }
把参数按从低到高把码值 转成实际要操作的高低电平pdata数组


然后在send_frame里进行发射

static void get_nec_data(unsigned int value)
{
 struct aml_irblaster_drv_s *drv = aml_irblaster_get_driver();
 unsigned int num = 0;
 int index;
 unsigned int *pdata = drv->windows;
 pdata[num++] = NEC_HEADER;
 pdata[num++] = NEC_IDLE;

       /*low bit first*/
 for (index = 0; index < 32; index++) {
 if (value & (0x01 << index)) {
 pdata[num++] = NEC_ONE[0];
 pdata[num++] = NEC_ONE[1];
 } else {
 pdata[num++] = NEC_ZERO[0];
 pdata[num++] = NEC_ZERO[1];
 }
 }
....


关键点就在注释这里,低位先发~!
所以再把上面拼接的数值调过头来,
0001(8) 0000(0) 1110(7) 1111(F)0111(E) 1000 (1) 1000(1) 0111 (E)
从低位到高位重排一下:
1110 0001 0001 1110 1111 0111 0000 0001
转换成10进制:2857717425


所以实际操作如下,发送用户码08、指令码1E的码值

irblaster open
irblaster send 2857717425
irblaster close




RTFSC!

最新喜欢:

conlanconlan VastStarGamesVastSt...
游客

返回顶部