前言:
为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
1.TR600语音编解码器简介:
TR600语音编码器是一款ASIC专用语音编码器芯片,是目前唯一自主知识产权的语音压缩解压缩芯片。采用可重组逻辑芯片技术、实现TR600语音编解码算法的灵活、高效的语音编解码器,可以执行实时、全双工操作。单芯片方式,无需外部存储器。TR600语音编解码算法是基于正弦激励线性预测的声码器算法,编解码性能优于常规的语音编解码算法,其特点是高语音压缩率下保证高自然度的语音质量,且用户可自行配置。
TR600 语音编码器是采用可重组逻辑芯片技术、实现 TR600 语音编解码算法的灵活、高效的语音编解码器,可以执行实时、全双工操作。TR600 语音编解码算法是基于正弦激励线性预测的声码器算法,编解码性能优于常规的语音编解码算法,是我国军用电台算法标准,其特点是高语音压缩率下保证高自然度的语音质量。压缩率可选择为 0.6kbps、 0.8kbps、 1.2kbps 或 2.4kbps。
2.串口连接
TR600 语音编码模块通过串口与4412进行数据通信,为TTL 3.3V。我们选择迅为4412的ttySAC3通过GPIO引出的TTL电平的串口进行通信。
如图:
通过GPIO引出:
TR600模块:
3、4412接收数据
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h> /*串口初始化结构体*/
#include <errno.h>
int set_opt(int,int,int,char,int);
void main()
{
int fd,nbyte,i,j=0;
int total_read_bytes = 0;
/*原理图中的网络是“BUF_GPS_TXD 和 BUF_GPS_RXD”,电平是 TTL3.3V*/
char *uart3 = "/dev/ttySAC3";
char buffer1[256],buffer2[512];
memset(buffer1,0,sizeof(buffer1));
memset(buffer2,0,sizeof(buffer2));
if((fd = open(uart3,O_RDWR | O_NOCTTY | O_NDELAY))<0){
printf("open %s is failed!\n",uart3);
}
else{
printf("open %s is success!\n",uart3);
set_opt(fd,115200,8,'N',1); /*串口初始化参数*/
printf("Start Reading\n");
while(1){
while((nbyte=read(fd,buffer1,256))>0)
{
memcpy(buffer2+total_read_bytes,buffer1,nbyte);
total_read_bytes+=nbyte;
}
usleep(100); /*延时*/
for(i=0;i<total_read_bytes;i++){
printf("0x%02x",buffer2[i]);
if(buffer2[i]==0x00){ /*控制为16个数一组输出*/
j ++;
if(j==6){
printf("\n");
printf("\n");
j=0;
}
}
}
total_read_bytes = 0;
}
}
close(fd);
}
/*串口的初始化设置*/
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)/*参数:句柄 波特率 数据位 校验位 停止位*/
{
struct termios newtio,oldtio; /*定义了两个termios结构体,旧的读出来赋值给新的,得到当前串口的参数*/
if ( tcgetattr( fd,&oldtio) != 0) { /*读取当前参数函数,读出oldtio*/
perror("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD; /*控制模式设置*/
newtio.c_cflag &= ~CSIZE; /*设置字符大小s*/
switch( nBits ) /*数据位*/
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch( nEvent ) /*奇偶校验*/
{
case 'O':
newtio.c_cflag |= PARENB;/* 设置为奇效验*/
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);/*INPCK:奇偶校验使能*/
break;
case 'E':
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N': /*无奇偶校验位*/
newtio.c_cflag &= ~PARENB;
break;
}
switch( nSpeed ) /*波特率设置*/
{
case 2400:
cfsetispeed(&newtio, B2400); /*输入*/
cfsetospeed(&newtio, B2400); /*输出*/
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
case 460800:
cfsetispeed(&newtio, B460800);
cfsetospeed(&newtio, B460800);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if( nStop == 1 ) /*停止位*/
newtio.c_cflag &= ~CSTOPB;
else if ( nStop == 2 )
newtio.c_cflag |= CSTOPB;
newtio.c_cc[VTIME] = 0;/*设置等待时间和最小接收字符*/
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH); /*处理未接收的字符.清空串口BUFFER中的数据函数*/
if((tcsetattr(fd,TCSANOW,&newtio))!=0) /*设置串口参数函数,激活新配置*/
{
perror("com set error");
return -1;
}
return 0;
}
经过测试,可以通过超级终端得到4412成功接收到的数据。