一、数据结构的设计
数据的传输我们可以稍微参考一些网络协议,一段数据在传输过程中可能会由于各种原因使得数据不能正确被接收,那么一个好的数据结构和传输机制将会让数据传输更有保障。
struct spi_data{
char sync_byte;//同步位,数据的开始
spicmd cmd;//命令,数据的意义
uint16 seq;//数据的序号,用于确保该条数据正确被接收
uint16 context;//命令内容
uint16 crc;//crc检验数据的完整
}//spi传输中的数据帧
enum spicmd{
req_send 0x0000;//请求发送数据命令
req_start;//音频的开始
req_end;//音频的结束
rsp_oknext;//数据正确接收,请发下一条
rsp_resend;//数据接收有误,请重发
}
enum decodetype{
mp3 0x0000;
aac;
wav;
m4a;
…
}//音频格式枚举
二、传输流程机制
当发送一个音频的时候,我们有必要在第一条数据中发送音频的必须信息(例:格式、名称、大小……)
发送第一条数据(例:test.mp3)
uint8 send_buffer[512];
char *audioname="test.mp3";
struct spidata * startdata=(struct spidata *)malloc(sizeof(spidata)); startdata->sybc_byte='S';
startdata->cmd=req_start;
startdata->seq=1;
startdata->context=sizeof(mp3)+strlen(audioname);
startdata->crc=getCrc(&spidata,sizeof(spidata)-sizeof(spidata.crc)); send_buffer[0]='S';//同步位
send_buffer[1]=mp3; mencpy(send_buffer+2,audioname,strlen(audioname));
(uint16 *)(send_buffer+strlen(audioname)+2)=getCrc(send_buffer,strlen(send_buffer)-1);
发送该数据直至slave返回数据。 当slave接收到数据,将会根据数据正确与否回复。
1、当数据正确回复:
struct spidata *response=(struct spidata *)malloc(sizeof(spidata)); response->sync_byte='S';
response->cmd=rsp_oknext;
response->seq=1;
response->crc=getCrc(response,sizeof(spidata)-1);
2、当数据检验crc错误回复:
response->cmd=rsp_resend;
主机master接收到slave回复后,根据回复cmd和seq序号确保上一条数据是否正确到达。
1、当收到slave回复cmd=rsp_oknext
,master就发送下一条数据(音频数据)cmd=req_send
。
2、当收到slaver回复cmd=rsp_resend
,master就重新发送该条数据。 当发送音频最后一段数据时,我们应该发送描述音频结束的数据,以确保接收端知道数据的终结。 master只需发送携带cmd=req_end
指令 即可,slave根据该cmd结束接收。
网友评论