0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

瑞萨RZ/G2L串口SCI的使用(下)

瑞萨MCU小百科 来源:瑞萨MCU小百科 2024-01-17 12:20 次阅读

RZ/G2L支持的最大波特率

c5791c44-b4ed-11ee-8b88-92fbcf53809c.png

RZ/G2L的SCIFA异步通讯模式下支持的最高波特率可以达到12.5Mbps,如果异步基础时钟选择16倍波特率,同时关闭波特率发生器的倍频模式下依然可以达到3.125Mbps。如果异步基础时钟选择8倍波特率或者波特率发生器开启倍频模式,最大波特率可以达到6.25Mbps。

在上集中我们有讲过RZ/G2L在Linux下的使用遵循POSIX标准。只要POSIX支持的波特率,RZ/G2L都可以支持,并且支持各种波特率下的误差修正,需要开启MDDRS寄存器

Linux下串口的波特率

Linux下termbits.h支持的波特率如下

左右滑动查看完整内容

/* c_cflag bit meaning */
#define CBAUD  0000377
#define B0 0000000   /* hang up */
#define B50  0000001
#define B75  0000002
#define B110  0000003
#define B134  0000004
#define B150  0000005
#define B200  0000006
#define B300  0000007
#define B600  0000010
#define B1200 0000011
#define B1800 0000012
#define B2400 0000013
#define B4800 0000014
#define B9600 0000015
#define B19200 0000016
#define B38400 0000017
#define EXTA  B19200
#define EXTB  B38400
#define CBAUDEX 0000000
#define B57600  00020
#define B115200 00021
#define B230400 00022
#define B460800 00023
#define B500000 00024
#define B576000 00025
#define B921600 00026
#define B1000000 00027
#define B1152000 00030
#define B1500000 00031
#define B2000000 00032
#define B2500000 00033
#define B3000000 00034
#define B3500000 00035
#define B4000000 00036

也就是标准的Linux支持的最大波特率是4Mbps,但并不是4Mbps以下任意一个波特率都可以支持,只有30种选择。

那如果在特殊的应用场景中,需要这30种波特率以外的选择,是否能够实现呢?答案是肯定的,但是比较复杂。

这里我们提供一种Linux下实现非POSIX标准串口波特率的方法给大家参考。

Linux串口非标波特率的实现

涉及两部分他,包括内核和应用层

首先第一步:我们需要修改内核中的串口驱动,确保串口驱动能够支持需要添加的非标波特率。上集我们已经分享过RZ/G2L的串口驱动代码路径是drivers/tty/serial/sh-sci.c,目前通过开启MDDRS,RZ/G2L几乎可以支持12.5Mbps以下的任意串口波特率。

这里我们以前面提到的3.125Mbps/6.25Mbps/12.5Mbps为例,github上下载的sh-sci.c驱动默认并没有开启波特率发生器的倍频模式,异步基础时钟选择的是默认的16倍波特率。所以最大的波特率可以支持到3.125Mbps,如果需要支持6.25Mbps或者更高的12.5Mbps,需要开启波特率发生器的倍频模式,并且允许异步基础时钟选择8倍波特率。

左右滑动查看完整内容

+    #if ABCS0_BGDM_EN
+      if(baud > 6250000){
+        //SEMR_BGDM:Baud rate generator double-speed mode Select:
+        //SEMR_ABCS0:Asynchronous Base Clock Select:
+        serial_port_out(port, SEMR,
+            serial_port_in(port, SEMR) | (SEMR_ABCS0 | SEMR_BGDM));
+        freq *= 2;
+        prediv /= 2;
+      }else if(baud > 3125000){
+        //SEMR_BGDM:Baud rate generator double-speed mode Select:
+        serial_port_out(port, SEMR,
+          serial_port_in(port, SEMR) | SEMR_BGDM);
+        freq *= 2;
+      }
+    #endif

这部分代码与RZ/G2L的平台相关,需要根据RZ/G2L的规格书配置对应的寄存器。

第二步:为了允许应用层配置我们添加的这三种波特率,需要修改drivers/tty/tty_baudrate.c和include/uapi/asm-generic/termbits.h,这两个文件与平台无关。想要在内核中添加系统默认的30种波特率以外的波特率都需要修改这两个文件。这两个文件的修改内容可以参考以下:

左右滑动查看完整内容

diff --git a/drivers/tty/tty_baudrate.c b/drivers/tty/tty_baudrate.c
index bdfaee2c1331..75d287893d11 100644
--- a/drivers/tty/tty_baudrate.c
+++ b/drivers/tty/tty_baudrate.c
@@ -24,7 +24,7 @@ static const speed_t baud_table[] = {
  1000000, 1152000, 1500000, 2000000
 #else
  500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
-  2500000, 3000000, 3500000, 4000000
+  2500000, 3000000, 3500000, 4000000, 3125000, 6250000, 12500000
 #endif
 };
 
@@ -36,7 +36,7 @@ static const tcflag_t baud_bits[] = {
  B1000000, B1152000, B1500000, B2000000
 #else
  B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000,
-  B2500000, B3000000, B3500000, B4000000
+  B2500000, B3000000, B3500000, B4000000, B3125000, B6250000, B12500000
 #endif
 };


 @@ -73,6 +73,14 @@ speed_t tty_termios_baud_rate(struct ktermios *termios)
    else
      cbaud += 15;
  }
+  if (cbaud & CBAUDEX2) {
+    cbaud &= ~CBAUDEX2;
+
+    if (cbaud < 1 || cbaud + 30 > n_baud_table)
+      termios->c_cflag &= ~CBAUDEX2;
+    else
+      cbaud += 30;
+  }
  return cbaud >= n_baud_table ? 0 : baud_table[cbaud];
 }
 EXPORT_SYMBOL(tty_termios_baud_rate);
diff --git a/include/uapi/asm-generic/termbits.h b/include/uapi/asm-generic/termbits.h
index 7db62a33ee52..1353300b6934 100644
--- a/include/uapi/asm-generic/termbits.h
+++ b/include/uapi/asm-generic/termbits.h
@@ -110,7 +110,7 @@ struct ktermios {
 #define  FF1 0100000
 
 /* c_cflag bit meaning */
-#define CBAUD 0010017
+#define CBAUD 0030017
 #define B0  0000000   /* hang up */
 #define B50  0000001
 #define B75  0000002


@@ -158,7 +158,9 @@ struct ktermios {
 #define B3500000 0010016
 #define B4000000 0010017
+#define CBAUDEX2 0020000
+#define B3125000 0020001
+#define B6250000 0020002
+#define B12500000 0020003
 #define CIBAUD  002003600000 /* input baud rate */
 #define CMSPAR  010000000000 /* mark or space (stick) parity */
 #define CRTSCTS   020000000000 /* flow control */

经过上面两步修改,内核已支持我们需要添加的3种非POSIX标准的串口波特率。

接下来演示应用层如何使用我们添加的这三种串口波特率。

左右滑动查看完整内容

#define B3125000 0020001
#define B6250000 0020002
#define B12500000 0020003
**
** 串口配置
** 参数 cfg 指向一个 uart_cfg_t 结构体对象
**/
static int uart_cfg(const uart_cfg_t *cfg)
{
  struct termios new_cfg = {0}; //将 new_cfg 对象清零
  speed_t speed;
  
  /* 设置为原始模式 */
  cfmakeraw(&new_cfg);
  
  /* 使能接收 */
  new_cfg.c_cflag |= CREAD| CLOCAL;
  
  /* 设置波特率 */
 speed = B3125000; // B3125000 B6250000 B12500000
new_cfg.c_cflag |= speed;


  /* 串口的其他属性配置参考标准的POSIX */


  /* 写入配置、使配置生效 */
  if (0 > tcsetattr(fd, TCSANOW, &new_cfg)) {
    fprintf(stderr, "tcsetattr error: %s
", strerror(errno));
    return -1;
  }

经过以上修改,我们就可以在linux下使用文章开头提到的RZ/G2L的最大波特率12.5Mbps进行串口通讯。

需要注意的是,我们给RZ/G2L添加的这三个波特率尤其是6.25Mbps或者12.5Mbps远超标准linux下支持的最大波特率4Mbps,所以,通过PC端的Ubuntu是无法使用这三种波特率与RZ/G2L的SMARC EVK板进行通讯测试的,如果要使用我们上面添加的这三种波特率,只能在两个SMARC EVK板上进行。

所以,除以上添加的这三种波特率外,如果要添加POSIX标准支持的30种以外的其他波特率,都可以参考这个方法来实现。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117745
  • 瑞萨
    +关注

    关注

    32

    文章

    22214

    浏览量

    84915
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74521
  • 异步通讯
    +关注

    关注

    0

    文章

    11

    浏览量

    7444

原文标题:RZ/G2L串口SCI的使用(下)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    瑞萨RZ/G2L串口SCI的使用(上)

    瑞萨RZ/G2L串口简称SCI,全称Serial Communication Interface。
    的头像 发表于 01-17 12:19 646次阅读
    瑞萨<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b><b class='flag-5'>串口</b><b class='flag-5'>SCI</b>的使用(上)

    飞凌嵌入式之G2L核心板及开发板开箱体验

    FET-G2LD-C核心板基于高性能、超高效处理器 RZ/G2L设计开发, 其采用多核异构,搭载Cortex-A55内核,运行频率高达1
    发表于 06-08 15:20

    G2L系列 核心板 -RZ/G2L 处理器简介|框架图|功耗|原理图及硬件设计指南

    定;源自汽车电子的技术积累,安全、可靠;10年+供货周期,批量采用有保障。得益于集成式的电源方案,RZ/G2L系列核心板尺寸可以控制得非常小,仅有60mm x 38mm。在板对板超
    发表于 06-21 14:45

    RZ/G2L实现的的HMI方案

    身影。飞凌嵌入式所推出的搭载RZ/G2L处理器的FET-G2LD-C核心板,采用Cortex-A55+Cortex-M33多核异构,支持
    发表于 07-06 15:01

    【飞凌RZ/G2L开发板试用体验】开箱帖子,飞凌质量YYDS

    ,品质指的信赖。飞凌RZ/G2L开发板基于RZ/G2L,在智能工控领域的一款高性能、超高效处
    发表于 08-15 18:46

    【飞凌RZ/G2L开发板试用体验】+01.开箱(zmj)

    带来的正是能满足这些要求的飞凌RZ/G2L开发板评估板套件。1.RZ/V2L评估套件简介RZ/V2L
    发表于 08-28 19:13

    【飞凌RZ/G2L开发板】飞凌RZ/G2L开发板试用测评报告

    、性能和试用的一些体会和试用开发过程记录下来,也分享给准备使用此开发板的朋友们。一、基本介绍收到开发板,开发板接上电源,开机如下图:图1 飞凌RZ/G2L开发板是基于
    发表于 08-29 02:01

    【米尔RZ/G2L开发板-试用体验】开箱

    感谢 感谢电子发烧友论坛、感谢米尔电子,把米尔RZ/G2L开发板试用话动的机会给了我。虽然周五就收到了开发板,但是由于复阳了,为了能及时的完成试用活动,所以今天努力的爬起来完成开箱
    发表于 05-14 19:41

    【米尔RZ/G2L开发板-试用体验】开箱 + 开机

    感谢 感谢电子发烧友论坛、感谢米尔电子,把米尔RZ/G2L开发板试用话动的机会给了我。最近事情比较多,赶在这个空挡时间完成开箱报告。 开箱 第一次拿到米尔电子的试用机会,简约的包装
    发表于 05-18 19:33

    【米尔RZ/G2L开发板-试用体验】LCD 显示测试

    实验器材 1、米尔RZ/G2L开发板 2、MY-TFT070-K显示屏 实现步骤 1、连接开发板与显示屏,这次配的数据线有点特殊,大家一
    发表于 05-22 19:26

    【米尔RZ/G2L开发板-试用体验】米尔-RZG2L - 64位双核MPU开发板开箱测评

    刚收到米尔RZ/G2L开发板打开包装后看到的很大的一块黑色PCB,做工精美的开发板,给人眼前一亮的感觉。 首先来介绍以下这家公司: 深圳市米尔电子有限公司,是一家专注于嵌入式处理器
    发表于 05-22 21:53

    【米尔RZ/G2L开发板-试用体验】米尔RZ/G2L开发板开箱视频

    今天刚刚收到米尔RZ/G2L开发板,拆开包裹后给人的感觉是惊艳,板卡设计真的很棒,来看看视频做个简单了解吧。 更多板卡可以登录官网了解哦。https://www.myi
    发表于 05-22 21:58

    150套开发板免费送!还有5G手机拿?米尔RZ/G2L开发板创意秀

    为感谢广大客户一直以来的支持,推动嵌入式行业技术发展,鼓励工程师勇于创新探索的精神,促进64位MPU的生态,米尔电子联合共同发起“米尔电子&
    发表于 05-24 16:36

    【米尔RZ/G2L开发板-试用体验】米尔RZ/G2L开发板使用SSH登录

    收到的米尔RZ/G2L开发板上电测试一SSH登录方式和其它测试! SSH登录 在使用之前,需要事先连接网络,笔者这里使用的是以太
    发表于 06-11 21:47

    【米尔RZ/G2L开发板-试用体验】认识一米尔RZ/G2L开发板的核心板

    解一米尔RZ/G2L开发板的核心板: MYC-YG2LX核心板采用高密度高速电路板设计,在
    发表于 07-29 00:21