UART
📎 原始文档:https://www.kdocs.cn/l/crujMy0DxiZl UART
1. uart基本知识 通用异步收发传输器称为UART。由发送端uart将发送端的并行数据转换为串行数据,以串行方式将其发送到接收端的,然后由接收端的uart将串行数据转换为并行数据以用于接收设备的正常处理。
- uart-SDK应用
2.1 uart串口打印调试
uart串口打印调试使用uart0,以下在板级文件中配置串口打印的IO口和波特率
uart打印IO口,可配置为芯片任意IO口
以下为串口打印开库打印总开关和打印系统时间和异常断言信息

2.2 充电仓/智能仓串口通讯
充电仓/智能仓通讯使用uart1,SDK使用时需要使能TCFG_TEST_BOX_ENABLE,充电仓通讯IO口默认配置为芯片LDO_IN绑定的IO口。通过该通讯口可以实现内置充电/uart通信/串口升级。
2.3 串口在线调音
本截图以696x-170SDK-新音箱配置工具&调音工具为案例,串口在线调音的具体方法可参考以下文档
新Tools的音效调试使用.otlEffectTool(eq)调试工具说明文档.pdfAC897AD697系列的EQ调试方法-V3.pdf
2.4 PCM串口调试

本截图以696x-170SDK做案例,pcm串口调试主要用于通话写卡调试,将通话时mic采集的原始数据、mic采集经过算法处理的数据和远端通话传过来经过DAC放出的数据写到SD卡中,使用写卡工具解析数据,再进一步分析调试。
需要注意的是PCM串口调试使用的是uart1,不要与其他使用uart1的功能做冲突;pcm调试的IO口也不要与uart0串口调试IO口做冲突。
PCM写卡工具使用说明和数据导出脚本参考 https://kdocs.cn/l/cpyHfHMfywJS
pcm串口写卡数据分析可参考通话数据分析方法-PCM写卡 V1.0.pdf
2. uart-各demo案例及应用 AC696X demo1:
链接:https://pan.baidu.com/s/12kkT4KoKb4svLmWH3mfh9g
提取码:jiel
AC696X demo2:
链接:https://pan.baidu.com/s/1YeC8VRFNX85EbvBdnYMsDQ
提取码:jiel
3.1 AC696X 串口单io进行收发数据
注意:debug串口初始化之前需要添加JL_UART0->CON0 = BIT(0);确保通信串口不被debug串口占用
#define UART_CLK clk_get("uart")
#define UART_OT_CLK clk_get("lsb")
#define UART_BAUD 1000000
#define UART_RX_TIMEOUT 1000//ms
#define UART JL_UART0//JL_UT1
static u8 uart_tx_buff[128];__attribute__((aligned(4)));
static u8 uart_rx_buff[128];__attribute__((aligned(4)));
static void test_uart_set_dma_dir(u32 dir){
if (dir) {
JL_PORTB->DIR |= BIT(5);
UART->CON1 &= ~BIT(4);
} else {
UART->CON1 |= BIT(4);
JL_PORTB->DIR &= ~BIT(5);
}
}
void test_uart_tx_data(u8 *buf, u32 len){
test_uart_set_dma_dir(0);
UART->TXADR = (u32)buf;
UART->TXCNT = len;
__asm__ volatile("csync");
while ((UART->CON0 & BIT(15)) == 0) { //TX IDLE
}
UART->CON0 |= BIT(13);
test_uart_set_dma_dir(1);
}
int test_uart_rx_data(u32 addr, u32 len){
wdt_clr();
test_uart_set_dma_dir(1);
UART->RXSADR = (u32)addr;
UART->RXEADR = (u32)(((addr + len) + 3) / 4 * 4);
/* UART->RXEADR = (u32)(addr + len); */
UART->RXCNT = len;
__asm__ volatile("csync");
while (1) {
if (UART->CON0 & (BIT(14) | BIT(11))) {
/* if (UART->CON0 & (BIT(11))) { */
/*if (UART->CON0 & (BIT(14))) {*/
break;
}
}
UART->CON0 |= BIT(7);
UART->CON0 |= BIT(10) | BIT(12);
__asm__ volatile("csync");
int rx_len = UART->HRXCNT;
UART->CON0 |= BIT(12) | BIT(10);
return rx_len;
}
void test_uart_init(){
JL_IOMAP->CON0 &= ~(3 << 3); //ut0_c
JL_IOMAP->CON0 |= (2 << 3);
JL_IOMAP->CON3 |= (1 << 3);
JL_PORTB->HD |= BIT(5);
JL_PORTB->PU |= BIT(5);
JL_PORTB->PD &= ~BIT(5);
JL_PORTB->DIR |= BIT(5);
UART->CON0 = BIT(13) | BIT(12) | BIT(10);
UART->CON0 = BIT(6) | BIT(0)| BIT(5);
UART->CON0 |= BIT(13) | BIT(12) | BIT(10);
UART->BAUD = (UART_CLK / UART_BAUD) / 4 - 1;
u32 timeout=UART_RX_TIMEOUT;//ms
UART->OTCNT = timeout * (UART_OT_CLK / 1000);//1000us
}
void test_uart_fun(void){
wdt_close();
test_uart_init();
sprintf(uart_tx_buff,"=================0x%x 0x%x 0x%x\r\n",JL_UART0->CON0,JL_UART1->CON0,JL_UART2->CON0);
test_uart_tx_data(uart_tx_buff,sizeof(uart_tx_buff));
int len=0;
while (1){
memset(uart_rx_buff,0,sizeof(uart_rx_buff));
memset(uart_tx_buff,0,sizeof(uart_tx_buff));
len=test_uart_rx_data(uart_rx_buff,32);
test_uart_tx_data(uart_rx_buff,len);
printf(uart_rx_buff);
}
}
3.2 AD697 简单串口收发demo
在app_config.h进行配置
//*********************************************************************************//
// uart demo //
//*********************************************************************************//
#define UART_DEMO_EN 1
#define UART_DEMO_TX IO_PORT_DP
#define UART_DEMO_RX IO_PORT_DM
#define UART_DEMO_BAUD 115200
在user_uart_demo.c中有收发简单例程
void uart_rx_data_analyze(u8 *data, u16 len)
{
u32 offset = 0;
test_printf("uart rx date len = %d, data = \n", len);
test_putbuf(data, len);
u8 head = 0xaa;
//回复接收到的data
// offset += uart_tx_data_input(head, offset, 1);
offset += uart_tx_buff_input(data, offset, len);
test_printf("offset = %d\n", offset);
if (offset) {
//发送uart_txbuf中
uart_bus->write(uart_txbuf, offset);
}
}
具体看demo文件
【金山文档】 AD697_串口demo_20220817
https://kdocs.cn/l/cmdY4d375c95
3.3 UART串口透传(较公版代码稳定)
【金山文档】 uart_dev.c(对比695_310_sdk此文件)
https://kdocs.cn/l/cltEjESEkOJX
3.4 从UART获取数据写到TF卡demo
【金山文档】 20220726_AC695v310_uart2tf_demo
https://kdocs.cn/l/cojkOh8aCofw
3.5 利用UART实现的耳机产测功能
见以下文档小牛产测部分
产测相关应用.otl
3.6 USB直连电脑做串口通讯
注:usb直连做串口通讯, 实际就是替换usb串口在线调音的回调
696、695修改如下
- 关pc、usb功能


- 开在线调音功能并且选择TCFG_USB_COMM

- 修改usb 串口处理回调,改为自己的处理接口


