关于英飞凌CYW20829的串口收发实现,从以下几个方面进行详细说明:
UART(通用异步接收器/发送器)是嵌入式开发中最常用的设备间通信协议之一。它使用两个引脚(TX和RX)实现数据传输(设备间需要共地),如果是单向传输可以只用一个引脚。在使用串口时,需要关注的是数据流以及波特率。一个标准的数据流由10个数据位组成,包括1位起始位、7位有效数据位、1位奇偶校验位(可选)和1位停止位。
下面正式开始,并上传我进行的步骤:
打开软件,找到UART_Transmit_and_Receive工程并打开MIAN程序。
串口初始化
在英飞凌CYW20829的开发中,串口初始化是数据传输的前提。初始化通常包括设置波特率、数据位、停止位和校验位等参数。
HAL库进行配置:
cyhal_uart_cfg_t uart_config = {
.data_bits = 8, // 数据位
.stop_bits = 1, // 停止位
.parity = CYHAL_UART_PARITY_NONE, // 校验位
.rx_buffer = NULL, // 接收缓冲区(示例中未使用)
.rx_buffer_size = 0 // 接收缓冲区大小(示例中未使用)
};
cyhal_uart_init(&uart_obj, CYBSP_BT_UART_TX, CYBSP_BT_UART_RX, CYBSP_BT_UART_CTS, CYBSP_BT_UART_RTS, NULL, &uart_config);
cyhal_uart_set_baud(&uart_obj, 115200, NULL); // 设置波特率为115200
串口发送与接收
发送数据
串口发送数据通常使用cyhal_uart_putc或cyhal_uart_put_async等函数。
接收到的数据原样返回:
int main(void) {
cy_rslt_t result;
uint8_t read_data;
result = cybsp_init();
if (result != CY_RSLT_SUCCESS) {
CY_ASSERT(0);
}
app_uart_init(); // 假设app_uart_init中包含了上述的串口初始化代码
__enable_irq();
for (;;) {
if (CY_RSLT_SUCCESS == cyhal_uart_getc(&uart_obj, &read_data, 0)) {
cyhal_uart_putc(&uart_obj, read_data);
}
}
}
接收数据
接收数据同样可以使用cyhal_uart_getc函数,但如果是非阻塞方式或需要处理多个字节的数据,可能需要使用更复杂的逻辑,如设置接收缓冲区、使用中断或轮询等。
使用回调函数来处理接收到的数据:
void APP_UartCB(void *callback_arg, cyhal_uart_event_t event) {
static uint8_t uart_rx_buffer[1]; // 假设每次只接收一个字节
switch (event) {
case CYHAL_UART_IRQ_RX_DONE:
cyhal_uart_putc(&uart_obj, uart_rx_buffer[0]); // 将接收到的数据原样返回
cyhal_uart_read_async(&uart_obj, uart_rx_buffer, 1); // 重新启动异步接收
break;
default:
break;
}
}
void app_uart_init(void) {
// ...(串口初始化代码,同上)
cyhal_uart_register_callback(&uart_obj, APP_UartCB, NULL);
cyhal_uart_enable_event(&uart_obj, CYHAL_UART_IRQ_RX_DONE, 2, true);
cyhal_uart_read_async(&uart_obj, uart_rx_buffer, 1); // 启动异步接收
}
复制代码
// 定义一个无限循环,用于持续地从UART读取数据并发送数据
for (;;)
{
// 尝试从UART读取一个字节的数据
// cy_retarget_io_uart_obj 是之前已经初始化好的UART对象
// read_data 是用来存储读取到的数据的变量
// 第三个参数0表示这是一个阻塞调用,即如果没有数据可读,函数将等待直到有数据可读
if (CY_RSLT_SUCCESS == cyhal_uart_getc(&cy_retarget_io_uart_obj, &read_data, 0))
{
// 如果成功从UART读取到数据
// 尝试将读取到的数据发送回UART
if (CY_RSLT_SUCCESS != cyhal_uart_putc(&cy_retarget_io_uart_obj, read_data))
{
// 如果发送数据失败,则调用handle_error函数处理错误
handle_error();
}
}
else
{
// 如果从UART读取数据失败(比如因为超时或硬件问题),则调用handle_error函数处理错误
handle_error();
}
// 注意:这里没有添加任何形式的延时或条件判断来跳出循环
// 这意味着程序将无限期地继续执行上述操作
}
输出返回结果:
|