基于TI DSP的串行通信设计
这是当初刚学DSP的时候做的东西(DSP+上位机的软件示波器)。
定点DSP运算的数据都是定点数,为了更好的支持小数的运算,经常采用Q格式或者S格式来表示小数。在TMS320F2812 DSP的软件编程上,采用了TI公司的智能Q格式(IQmath)。它可以在Q=1至30之间,用32位的定点数方便地表示不同范围的浮点数。而且,TMS320F2812已经将数学表固化在了BOOTROM中,在DSP上电时,将数学表自动加载到RAM里面。采用IQmath之后,可以直接调用相应的数学函数,大大提高编程与运行的效率。
在实际的通信过程中,考虑到DSP的串行缓冲区和PC机的缓冲区的数据位最大是8位,在DSP中,需要将待发送的32位的定点数拆分为4个8位数,然后依次发送;在上位机收到之后,按照顺序将数据包重组,再将收到的定点数除以定标值,即可方便的转换为实际的浮点数值。
DSP软件中的数据处理函数如下: void DataProcess (_iq input) { Uint16 j,m,temp[4]; for(j=0;j<4;j++) { m=(3-j)*8; temp[j]=( input >>m)&0x000000FF; ScibRegs.SCITXBUF=temp[j]; } } 在接收端LabVIEW的串行通信过程中,数据是以字符串的格式组成的,字符串中的每个字符实际上对应的是ASCII字符,所以在传送到串口发送数据之前要经过代码转换,串口数据必须转化为ASCII字符串才能进行传送和接收。在LabVIEW软件中,提供了十六进制数组转换为ASCII字符串的模块,用户只需编程完成十进制数据向十六进制数据的转换。 异步通信方式下,通信双方无统一时钟同步,传送的信息以1个字符数据为单位,开头与结尾均有特别的位码供接收方识别。但是,实际应用中要传输的数据是由多个字节组成的。要传输的数据有多种,每一种数据都有一个变量标识和实际的数据值。在这种情况下,在DSP端就要对每一种数据进行打包,把变量标识和数据值组合成一个完整的数据帧,然后再通过串口依次发送打包后的字节。
这里用查询方式实现串口通讯,下面是初始化和通信实现的程序。 void scib_fifo_init() { ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol ScibRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE ScibRegs.SCICTL2.bit.TXINTENA =1; ScibRegs.SCICTL2.bit.RXBKINTENA =1; ScibRegs.SCIHBAUD =0x0000; ScibRegs.SCILBAUD =0x00f3; ScibRegs.SCICCR.bit.LOOPBKENA =0; // Enable loop back ScibRegs.SCIFFTX.all=0xC028; ScibRegs.SCIFFRX.all=0x0028; ScibRegs.SCIFFCT.all=0x00; ScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1; ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
|