[PSOC™ Creator] 英飞凌CYW20829+串口收发

[复制链接]
 楼主| meiyaolei 发表于 2024-7-10 19:44 | 显示全部楼层 |阅读模式
<
关于英飞凌CYW20829的串口收发实现,从以下几个方面进行详细说明:
UART(通用异步接收器/发送器)是嵌入式开发中最常用的设备间通信协议之一。它使用两个引脚(TX和RX)实现数据传输(设备间需要共地),如果是单向传输可以只用一个引脚。在使用串口时,需要关注的是数据流以及波特率。一个标准的数据流由10个数据位组成,包括1位起始位、7位有效数据位、1位奇偶校验位(可选)和1位停止位。
下面正式开始,并上传我进行的步骤:
打开软件,找到UART_Transmit_and_Receive工程并打开MIAN程序。

串口初始化
在英飞凌CYW20829的开发中,串口初始化是数据传输的前提。初始化通常包括设置波特率、数据位、停止位和校验位等参数。
HAL库进行配置:
  1. cyhal_uart_cfg_t uart_config = {  
  2.     .data_bits = 8,       // 数据位  
  3.     .stop_bits = 1,       // 停止位  
  4.     .parity = CYHAL_UART_PARITY_NONE, // 校验位  
  5.     .rx_buffer = NULL,    // 接收缓冲区(示例中未使用)  
  6.     .rx_buffer_size = 0   // 接收缓冲区大小(示例中未使用)  
  7. };  
  8. cyhal_uart_init(&uart_obj, CYBSP_BT_UART_TX, CYBSP_BT_UART_RX, CYBSP_BT_UART_CTS, CYBSP_BT_UART_RTS, NULL, &uart_config);  
  9. cyhal_uart_set_baud(&uart_obj, 115200, NULL); // 设置波特率为115200
串口发送与接收
发送数据
串口发送数据通常使用cyhal_uart_putc或cyhal_uart_put_async等函数。
接收到的数据原样返回:
  1. int main(void) {  
  2.     cy_rslt_t result;  
  3.     uint8_t read_data;  
  4.   
  5.     result = cybsp_init();  
  6.     if (result != CY_RSLT_SUCCESS) {  
  7.         CY_ASSERT(0);  
  8.     }  
  9.   
  10.     app_uart_init(); // 假设app_uart_init中包含了上述的串口初始化代码  
  11.   
  12.     __enable_irq();  
  13.   
  14.     for (;;) {  
  15.         if (CY_RSLT_SUCCESS == cyhal_uart_getc(&uart_obj, &read_data, 0)) {  
  16.             cyhal_uart_putc(&uart_obj, read_data);  
  17.         }  
  18.     }  
  19. }
接收数据
接收数据同样可以使用cyhal_uart_getc函数,但如果是非阻塞方式或需要处理多个字节的数据,可能需要使用更复杂的逻辑,如设置接收缓冲区、使用中断或轮询等。
使用回调函数来处理接收到的数据:
  1. void APP_UartCB(void *callback_arg, cyhal_uart_event_t event) {  
  2.     static uint8_t uart_rx_buffer[1]; // 假设每次只接收一个字节  
  3.   
  4.     switch (event) {  
  5.         case CYHAL_UART_IRQ_RX_DONE:  
  6.             cyhal_uart_putc(&uart_obj, uart_rx_buffer[0]); // 将接收到的数据原样返回  
  7.             cyhal_uart_read_async(&uart_obj, uart_rx_buffer, 1); // 重新启动异步接收  
  8.             break;  
  9.         default:  
  10.             break;  
  11.     }  
  12. }  
  13.   
  14. void app_uart_init(void) {  
  15.     // ...(串口初始化代码,同上)  
  16.   
  17.     cyhal_uart_register_callback(&uart_obj, APP_UartCB, NULL);  
  18.     cyhal_uart_enable_event(&uart_obj, CYHAL_UART_IRQ_RX_DONE, 2, true);  
  19.     cyhal_uart_read_async(&uart_obj, uart_rx_buffer, 1); // 启动异步接收  
  20. }


  1. 复制代码
  2. // 定义一个无限循环,用于持续地从UART读取数据并发送数据  
  3. for (;;)  
  4. {  
  5.     // 尝试从UART读取一个字节的数据  
  6.     // cy_retarget_io_uart_obj 是之前已经初始化好的UART对象  
  7.     // read_data 是用来存储读取到的数据的变量  
  8.     // 第三个参数0表示这是一个阻塞调用,即如果没有数据可读,函数将等待直到有数据可读  
  9.     if (CY_RSLT_SUCCESS == cyhal_uart_getc(&cy_retarget_io_uart_obj, &read_data, 0))  
  10.     {  
  11.         // 如果成功从UART读取到数据  
  12.         // 尝试将读取到的数据发送回UART  
  13.         if (CY_RSLT_SUCCESS != cyhal_uart_putc(&cy_retarget_io_uart_obj, read_data))  
  14.         {  
  15.             // 如果发送数据失败,则调用handle_error函数处理错误  
  16.             handle_error();  
  17.         }  
  18.     }  
  19.     else  
  20.     {  
  21.         // 如果从UART读取数据失败(比如因为超时或硬件问题),则调用handle_error函数处理错误  
  22.         handle_error();  
  23.     }  
  24.   
  25.     // 注意:这里没有添加任何形式的延时或条件判断来跳出循环  
  26.     // 这意味着程序将无限期地继续执行上述操作  
  27. }


输出返回结果:






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
weifeng90 发表于 2024-7-11 07:40 来自手机 | 显示全部楼层
这种收发数据处理不好
 楼主| meiyaolei 发表于 2024-7-12 16:11 | 显示全部楼层
weifeng90 发表于 2024-7-11 07:40
这种收发数据处理不好

是的,不怎么好玩
原来是wjc 发表于 2025-2-28 23:26 | 显示全部楼层
在 CYW20829 设备上进行串口通信时,通常需要先进行串口初始化,配置波特率、数据位、停止位和校验位等参数。
慢醇 发表于 2025-4-30 16:25 | 显示全部楼层
CYW20829的串口初始化可以通过HAL库函数进行配置,以下是详细的步骤和代码说明。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

254

主题

825

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:工程师
简介:超越自我,为设计激发灵感和想象。

254

主题

825

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部