0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

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

瑞薩MCU小百科 ? 來源:瑞薩MCU小百科 ? 2024-01-17 12:20 ? 次閱讀

RZ/G2L支持的最大波特率

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

RZ/G2L的SCIFA異步通訊模式下支持的最高波特率可以達到12.5Mbps,如果異步基礎時鐘選擇16倍波特率,同時關閉波特率發(fā)生器的倍頻模式下依然可以達到3.125Mbps。如果異步基礎時鐘選擇8倍波特率或者波特率發(fā)生器開啟倍頻模式,最大波特率可以達到6.25Mbps。

在上集中我們有講過RZ/G2L在Linux下的使用遵循POSIX標準。只要POSIX支持的波特率,RZ/G2L都可以支持,并且支持各種波特率下的誤差修正,需要開啟MDDRS寄存器。

Linux下串口的波特率

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

左右滑動查看完整內(nèi)容

/* 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種波特率以外的選擇,是否能夠?qū)崿F(xiàn)呢?答案是肯定的,但是比較復雜。

這里我們提供一種Linux下實現(xiàn)非POSIX標準串口波特率的方法給大家參考。

Linux串口非標波特率的實現(xiàn)

涉及兩部分他,包括內(nèi)核和應用層

首先第一步:我們需要修改內(nèi)核中的串口驅(qū)動,確保串口驅(qū)動能夠支持需要添加的非標波特率。上集我們已經(jīng)分享過RZ/G2L的串口驅(qū)動代碼路徑是drivers/tty/serial/sh-sci.c,目前通過開啟MDDRS,RZ/G2L幾乎可以支持12.5Mbps以下的任意串口波特率。

這里我們以前面提到的3.125Mbps/6.25Mbps/12.5Mbps為例,github上下載的sh-sci.c驅(qū)動默認并沒有開啟波特率發(fā)生器的倍頻模式,異步基礎時鐘選擇的是默認的16倍波特率。所以最大的波特率可以支持到3.125Mbps,如果需要支持6.25Mbps或者更高的12.5Mbps,需要開啟波特率發(fā)生器的倍頻模式,并且允許異步基礎時鐘選擇8倍波特率。

左右滑動查看完整內(nèi)容

+    #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的平臺相關,需要根據(jù)RZ/G2L的規(guī)格書配置對應的寄存器。

第二步:為了允許應用層配置我們添加的這三種波特率,需要修改drivers/tty/tty_baudrate.c和include/uapi/asm-generic/termbits.h,這兩個文件與平臺無關。想要在內(nèi)核中添加系統(tǒng)默認的30種波特率以外的波特率都需要修改這兩個文件。這兩個文件的修改內(nèi)容可以參考以下:

左右滑動查看完整內(nèi)容

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 */

經(jīng)過上面兩步修改,內(nèi)核已支持我們需要添加的3種非POSIX標準的串口波特率。

接下來演示應用層如何使用我們添加的這三種串口波特率。

左右滑動查看完整內(nèi)容

#define B3125000 0020001
#define B6250000 0020002
#define B12500000 0020003
**
** 串口配置
** 參數(shù) cfg 指向一個 uart_cfg_t 結(jié)構(gòu)體對象
**/
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;
  }

經(jīng)過以上修改,我們就可以在linux下使用文章開頭提到的RZ/G2L的最大波特率12.5Mbps進行串口通訊。

需要注意的是,我們給RZ/G2L添加的這三個波特率尤其是6.25Mbps或者12.5Mbps遠超標準linux下支持的最大波特率4Mbps,所以,通過PC端的Ubuntu是無法使用這三種波特率與RZ/G2L的SMARC EVK板進行通訊測試的,如果要使用我們上面添加的這三種波特率,只能在兩個SMARC EVK板上進行。

所以,除以上添加的這三種波特率外,如果要添加POSIX標準支持的30種以外的其他波特率,都可以參考這個方法來實現(xiàn)。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5250

    瀏覽量

    119193
  • 瑞薩
    +關注

    關注

    33

    文章

    22274

    瀏覽量

    85507
  • 串口
    +關注

    關注

    14

    文章

    1533

    瀏覽量

    75451
  • 異步通訊
    +關注

    關注

    0

    文章

    12

    瀏覽量

    7459

原文標題:RZ/G2L串口SCI的使用(下)

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于電子RZ/G2L的FET-G2LD-C核心板和OK-G2LD-C開發(fā)板評測

    基于電子RZ/G2L處理器開發(fā)的FET-G2LD-C核心板和OK-G2LD-C開發(fā)板。
    發(fā)表于 05-30 17:24 ?1124次閱讀
    基于<b class='flag-5'>瑞</b><b class='flag-5'>薩</b>電子<b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>的FET-<b class='flag-5'>G2</b>LD-C核心板和OK-<b class='flag-5'>G2</b>LD-C開發(fā)板評測

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

    RZ/G2L串口簡稱SCI,全稱Serial Communication Interfac
    的頭像 發(fā)表于 01-17 12:19 ?1214次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b><b class='flag-5'>串口</b><b class='flag-5'>SCI</b>的使用(上)

    【飛凌RZ/G2L開發(fā)板試用體驗】+01.開箱(zmj)

    帶來的正是能滿足這些要求的飛凌RZ/G2L開發(fā)板評估板套件。1.RZ/V2L評估套件簡介RZ/V2L
    發(fā)表于 08-28 19:13

    【米爾RZ/G2L開發(fā)板-試用體驗】開箱

    感謝 感謝電子發(fā)燒友論壇、感謝米爾電子,把米爾RZ/G2L開發(fā)板試用話動的機會給了我。雖然周五就收到了開發(fā)板,但是由于復陽了,為了能及時的完成試用活動,所以今天努力的爬起來完成開箱
    發(fā)表于 05-14 19:41

    【米爾RZ/G2L開發(fā)板-試用體驗】開箱 + 開機

    感謝 感謝電子發(fā)燒友論壇、感謝米爾電子,把米爾RZ/G2L開發(fā)板試用話動的機會給了我。最近事情比較多,趕在這個空擋時間完成開箱報告。 開箱 第一次拿到米爾電子的試用機會,簡約的包裝
    發(fā)表于 05-18 19:33

    【米爾RZ/G2L開發(fā)板-試用體驗】米爾RZ/G2L開發(fā)板開箱視頻

    今天剛剛收到米爾RZ/G2L開發(fā)板,拆開包裹后給人的感覺是驚艷,板卡設計真的很棒,來看看視頻做個簡單了解吧。 更多板卡可以登錄官網(wǎng)了解哦。https://www.myi
    發(fā)表于 05-22 21:58

    150套開發(fā)板免費送!還有5G手機拿?米爾RZ/G2L開發(fā)板創(chuàng)意秀

    為感謝廣大客戶一直以來的支持,推動嵌入式行業(yè)技術發(fā)展,鼓勵工程師勇于創(chuàng)新探索的精神,促進64位MPU的生態(tài),米爾電子聯(lián)合共同發(fā)起“米爾電子&
    發(fā)表于 05-24 16:36

    【米爾RZ/G2L開發(fā)板-試用體驗】米爾RZ/G2L開發(fā)板使用SSH登錄

    收到的米爾RZ/G2L開發(fā)板上電測試一SSH登錄方式和其它測試! SSH登錄 在使用之前,需要事先連接網(wǎng)絡,筆者這里使用的是以太
    發(fā)表于 06-11 21:47

    【米爾RZ/G2L開發(fā)板-試用體驗】認識一米爾RZ/G2L開發(fā)板的核心板

    解一米爾RZ/G2L開發(fā)板的核心板: MYC-YG2LX核心板采用高密度高速電路板設計,在
    發(fā)表于 07-29 00:21

    G2L系列核心板-RZ/G2L處理器簡介

    RZ/G2L在智能工控領域的一款高性能、超高效處理器。RZ/G2L采用Arm Cortex
    發(fā)表于 06-09 11:54 ?867次閱讀

    米爾RZ/G2L開發(fā)板-初體驗

    介紹米爾RZ/G2L開發(fā)板
    的頭像 發(fā)表于 05-15 09:10 ?892次閱讀
    米爾<b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>開發(fā)板-初體驗

    米爾RZ/G2L開發(fā)板 TF卡讀寫速度測試

    米爾RZ/G2L開發(fā)板TF卡讀寫測試
    的頭像 發(fā)表于 05-22 09:07 ?1255次閱讀
    米爾<b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>開發(fā)板 TF卡讀寫速度測試

    米爾RZ/G2L開發(fā)板 安裝交叉編譯器

    米爾RZ/G2L開發(fā)板安裝交叉編譯器
    的頭像 發(fā)表于 05-26 22:05 ?1947次閱讀
    米爾<b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b>開發(fā)板 安裝交叉編譯器

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

    RZ/G2L串口SCI的使用
    的頭像 發(fā)表于 07-25 08:06 ?329次閱讀
    <b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b><b class='flag-5'>串口</b><b class='flag-5'>SCI</b>的使用(上)

    RZ/G2L串口SCI的使用(

    RZ/G2L串口SCI的使用
    的頭像 發(fā)表于 08-03 08:06 ?340次閱讀
    <b class='flag-5'>RZ</b>/<b class='flag-5'>G2L</b><b class='flag-5'>串口</b><b class='flag-5'>SCI</b>的使用(<b class='flag-5'>下</b>)