linux下串口raw驅動(US100超聲波)--Apple的學習筆記 一,前言 二,設備樹修改 三,遇到的問題 四 測試結果正確 五,參考網址

一,前言

今天玩一下US100超聲波傳感器。5年前玩尋路小車的時候用過,已經忘記了。先看了下它的原理,除了支持gpio還支持uart的。給它輸入0x55命令可以獲取2個字節的距離mm信息。那麼我就用下串口子系統。基於console的其實一直在用,但是我都沒了解過tty的框架。正好網上了解下,資料比較多,我就不多說。配置完設置樹,使用8250底層uart驅動及tty驅動,所以驅動不用自己寫,配置完設備樹,寫了read/write APP就能用了。工程已上傳我的gitee工程13。

二,設備樹修改

a.先用PC串口調試助手使用了下US100。驗證器件正常。GND我就連接了一根。



b.看了下datasheet及原理圖,決定使用UART1。
am335x-bone-common.dtsi修改下

uart1_pins: pinmux_uart1_pins {
    pinctrl-single,pins = <
            AM33XX_PADCONF(AM335X_PIN_UART1_RXD, PIN_INPUT_PULLUP, MUX_MODE0)
            AM33XX_PADCONF(AM335X_PIN_UART1_TXD, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
        >;
    };

&uart1 {
    pinctrl-names = "default";
    pinctrl-0 = <&uart1_pins>;

    status = "okay";
};

三,遇到的問題

1. 到底註冊到哪個設備了,那麼多tty。
log信息可以看出註冊到了ttyS1

[    1.013776] Serial: 8250/16550 driver, 6 ports, IRQ sharing enabled
[    1.019091] 44e09000.serial: ttyS0 at MMIO 0x44e09000 (irq = 29, base_baud = 3000000) is a 8250
[    1.814064] printk: console [ttyS0] enabled
[    1.820211] 48022000.serial: ttyS1 at MMIO 0x48022000 (irq = 35, base_baud = 3000000) is a 8250

設備描述中也可以看到更詳細的內容。

# pwd
/sys/bus/platform/drivers/omap8250/48022000.serial
# ls -al
total 0
drwxr-xr-x    5 root     root             0 Jan  1 00:02 .
drwxr-xr-x    4 root     root             0 Jan  1 00:02 ..
lrwxrwxrwx    1 root     root             0 Jan  1 00:02 driver -> ../../../../../../../bus/platform/drivers/omap8250
-rw-r--r--    1 root     root          4096 Jan  1 00:02 driver_override
-r--r--r--    1 root     root          4096 Jan  1 00:02 modalias
lrwxrwxrwx    1 root     root             0 Jan  1 00:02 of_node -> ../../../../../../../firmware/devicetree/base/ocp/interconnect@48000000/segment@0/target-module@22000/serial@0
drwxr-xr-x    2 root     root             0 Jan  1 00:02 power
lrwxrwxrwx    1 root     root             0 Jan  1 00:02 subsystem -> ../../../../../../../bus/platform
drwxr-xr-x    3 root     root             0 Jan  1 00:02 tty
-rw-r--r--    1 root     root          4096 Jan  1 00:02 uevent
drwxr-xr-x    3 root     root             0 Jan  1 00:02 wakeup
# cd tty
# ls
ttyS1

2. write一直阻塞。
我的app是先write 0x55,然後read 2字節,結果write就阻塞了。懷疑線反了,反接後依然write 阻塞。於是用示波器,看了下波形幅度值不到5。所以將usb上電改成了電源上電。問題解決。示波器發送0x55截圖如下,


另外,我用echo -e -n "\x55" > /dev/ttyS1截圖也是一樣的。並且由於發送成功,所以我截取rx腳,接收也成功。接收2字節如下圖

3. read一直阻塞
示波器都已經顯示read有正常的波形,但是read一直被阻塞。我懷疑杜邦線斷了,用萬用表測量線正常。難道是沒有進入中斷。我之前看框架的時候ftrace也跟蹤過,但是ftrace內容太多了,因爲uart0也是用8250,所以我區分不了。那麼從/proc/interrupts來查看中斷。如下可以看出35號中斷一開始是沒有的,運行了us程序後,35號中斷出現。最後我只能看源碼,當然最快的速度是網上找下框架資料,比如接收中斷是哪個函數,然後又會調用哪裏。接着找到了線索,他描述的接收中斷居然是從console輸入作爲接收中斷的,然後echo回顯到console。那麼我立即想到一個問題,我不用console的,是否就不能喚醒read中。所以是否有些設置bypass console。本來想看了document的幫助,因爲我覺得linux的串口驅動不會有bug的,先網上搜索下,立即得到答案。原來需要設置raw模塊的串口通信。在raw模式下最後運行app,獲取結果正確。

# cat /proc/interrupts
           CPU0       
 16:        618      INTC  68 Level     gp_timer
 18:          0      INTC   3 Level     arm-pmu
 19:          8      INTC  12 Level     49000000.edma_ccint
 21:          0      INTC  14 Level     49000000.edma_ccerrint
 28:          0      INTC  96 Level     44e07000.gpio
 29:        108      INTC  72 Level     44e09000.serial
 30:        146      INTC  70 Level     44e0b000.i2c
 43:          0      INTC  98 Level     4804c000.gpio
 44:         37      INTC  64 Level     mmc0
 46:          0      INTC  30 Level     4819c000.i2c
 47:          0      INTC  32 Level     481ac000.gpio
 48:          0      INTC  62 Level     481ae000.gpio
 49:         47      INTC  28 Level     mmc1
 53:       1191      INTC  41 Level     4a100000.ethernet
 54:        689      INTC  42 Level     4a100000.ethernet
 57:          0  44e07000.gpio   6 Edge      48060000.mmc cd
 58:          0      INTC   7 Level     tps65217-irq
IPI0:          0  CPU wakeup interrupts
IPI1:          0  Timer broadcast interrupts
IPI2:          0  Rescheduling interrupts
IPI3:          0  Function call interrupts
IPI4:          0  CPU stop interrupts
IPI5:          0  IRQ work interrupts
IPI6:          0  completion interrupts
Err:          0
# cd /usr/study/
# 
# ./us &
# ok
# cat /proc/interrupts
           CPU0       
 16:       1012      INTC  68 Level     gp_timer
 18:          0      INTC   3 Level     arm-pmu
 19:          8      INTC  12 Level     49000000.edma_ccint
 21:          0      INTC  14 Level     49000000.edma_ccerrint
 28:          0      INTC  96 Level     44e07000.gpio
 29:        247      INTC  72 Level     44e09000.serial
 30:        146      INTC  70 Level     44e0b000.i2c
 35:          0      INTC  73 Level     48022000.serial
 43:          0      INTC  98 Level     4804c000.gpio
 44:         37      INTC  64 Level     mmc0
 46:          0      INTC  30 Level     4819c000.i2c
 47:          0      INTC  32 Level     481ac000.gpio
 48:          0      INTC  62 Level     481ae000.gpio
 49:         47      INTC  28 Level     mmc1
 53:       1373      INTC  41 Level     4a100000.ethernet
 54:        764      INTC  42 Level     4a100000.ethernet
 57:          0  44e07000.gpio   6 Edge      48060000.mmc cd
 58:          0      INTC   7 Level     tps65217-irq
IPI0:          0  CPU wakeup interrupts
IPI1:          0  Timer broadcast interrupts
IPI2:          0  Rescheduling interrupts
IPI3:          0  Function call interrupts
IPI4:          0  CPU stop interrupts
IPI5:          0  IRQ work interrupts
IPI6:          0  completion interrupts
Err:          0

四 測試結果正確

不同的障礙物距離,顯示的結果不同。

# stty -F /dev/ttyS1 9600 raw
# ./us
ok
write 0x55
distance is 91
write 0x55
distance is 45
write 0x55
distance is 198
write 0x55
distance is 120
write 0x55
distance is 1579

五,參考網址

a.http://blog.chinaunix.net/uid-27717694-id-3493611.html
b.https://blog.csdn.net/shipinsky/article/details/82177143
c.https://blog.csdn.net/lhl_blog/article/details/82254056

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章