1. 上位机向HID写数据时,每个包传输的第一个byte为写数据(OUT)report ID,上、下位机必须一致。
上位机配置位置:
下位机配置位置:
2. HID向上位机返回数据时,每个包的第一个byte也必须是读数据(IN)report ID, 在下位机中,IN report ID的定义一定要和发送包的第一个byte相一致,否则读取错误。IN report ID与上位机无关。
3. 下位机返回数据是通过调用SendPacket() 函数实现的
SendPacket()函数的参数,是reportID,追进SendPacket函数内部看,可以看到,其发送原理是根据参数的report ID,调用对应的report handle函数(对应的report handle函数会将要发送的数据放入IN_PACKET[64] buffer中),然后将IN_PACKET内的数据(即要发送的数据)发出。
如目前使用的reportID: IN_DATA,使用时就是SendPacket(IN_DATA),IN_DATA对应的report handle函数是IN_Data(),在IN_Data()中,将外部获取的数据赋值给IN_PACKET[64],代码如下:
void IN_Data (void)
{
inti;
IN_PACKET[0]= IN_DATA;
for(i=1; i<64; i++)
IN_PACKET[i]= PERIPHERAL_READ_BUF[i-1]; //PERIPHRAL_READ_BUF在main函数或其它函数中被赋值
//PERIPHRAL_READ_BUF用作其它代码与HID lib的发送数据传输桥梁
//这样可以把HID lib独立开
IN_BUFFER.Ptr= IN_PACKET;
IN_BUFFER.Length = IN_DATA_SIZE + 1;
}
注意:PERIPHERAL_READ_BUF就是自定义的外部接收数据存放buffer,为了与HID示例中HID操作的部分独立开,自己的程序可以对PERIPHERAL_READ_BUF进行赋值更改,发送时只要按HID示例的发送程序(SendPacket)操作就行。关键就是如上代码在IN_Data()函数中将两者联系起来。这样就可以把HID示例中,纯粹HID操作的部分独立出来,不用去管F340 的底层操作,这部分就可以做成lib。
自己的主函数中如要发送不同的数据,只要如下操作即可,
//Read process
caseFPGA_R:
{
for(cycCnt=0;cycCnt<64; cycCnt++)
{
PERIPHERAL_READ_BUF[cycCnt] = cycCnt +10;
} // 为PERIPHERAL_READ_BUF赋值可在任何需要的位置
SendPacket (IN_DATA);
OUT_PACKET[1]= 0;
break;
}
4. SPI接口在FPGA中只有SPI3W和SPI4W两个chipaddress,而上位机和下位机之间的协议针对每种SPI接口都会定义一个chip address,各种SPI接口都可以转变成SPI3W和SPI4W这两种情况,FPGA通过设置拼接寄存器(0x11)完成。
上位机在chipaddress下拉框中选择某种SPI接口后,就会在下拉框的消息函数中根据选择将FPGA配置成对应的拼接。
在下位机中,各SPI读写的分支下,要将上位机传过来的chip address分别再设置回FPGASPI3W或SPI4W的chip address。
参考:D:\Yifei\WorkPlace\Project\Driver_PG_HDMI2MIPI\Firmware readme