色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

基于CH347實現(xiàn)USB擴展SPI/I2C/GPIO Master主機應(yīng)用方案

jf_49670627 ? 來源:jf_49670627 ? 作者:jf_49670627 ? 2023-04-21 15:33 ? 次閱讀

?在安卓/Linux主機上經(jīng)常會遇到CPU原生SPI/I2C/GPIO Master資源通道不夠或者功性能不滿足實際產(chǎn)品需求的情況,基于USB2.0高速USB轉(zhuǎn)接芯片CH347,配合廠商提供的USB轉(zhuǎn)MPSI(Multi Peripheral Serial Line)Master總線驅(qū)動(CH34X-MSPI-Master)可輕松實現(xiàn)為系統(tǒng)擴展SPI和I2C總線、GPIO Expander、中斷信號等。

該驅(qū)動軟件正常工作后,會在系統(tǒng)下創(chuàng)建新的SPI和I2C Master,擁有獨立的bus num,原SPI和I2C器件的設(shè)備驅(qū)動可直接掛載到該總線上,無需任何修改。驅(qū)動會同時創(chuàng)建GPIO相關(guān)資源,各GPIO可通過sysfs文件系統(tǒng)或應(yīng)用層軟件直接訪問,也可以由其他設(shè)備驅(qū)動申請該GPIO的訪問權(quán)以及申請GPIO對應(yīng)中斷號并注冊中斷服務(wù)程序。

應(yīng)用框圖:

pYYBAGRCOvWAAefbAAK5hKXjgI0005.png

CH347是一款高速USB總線轉(zhuǎn)接芯片,通過USB總線提供異步串口、I2C同步串行接口、SPI同步串行接口和JTAG接口等。本方案僅使用到CH347的高速SPI、I2C串行總線,以及GPIO功能,使用串口功能需要單獨使用CH343SER串口驅(qū)動,使用JTAG功能或SPI和I2C的非總線模式應(yīng)用可使用CH341PAR多功能USB設(shè)備驅(qū)動。

驅(qū)動特點:

1、支持CH347與CH341總線轉(zhuǎn)接芯片;

2、支持SPI、I2C、GPIO、IRQ等接口和功能擴展;

3、支持SPI、I2C的bus總線號、GPIO編號、IRQ中斷號的動態(tài)分配以及靜態(tài)指定;

4、支持自動綁定spi通用設(shè)備驅(qū)動,創(chuàng)建/dev/spidev*;

驅(qū)動概述

該Master驅(qū)動支持在Linux/安卓主機上,使用USB轉(zhuǎn)串口/JTAG/SPI/I2C/GPIO轉(zhuǎn)換芯片CH347,和USB轉(zhuǎn)串口/SPI/I2C/GPIO轉(zhuǎn)換芯片CH341。

驅(qū)動僅支持SPI/I2C/GPIO接口,該文檔主要介紹CH347芯片的相關(guān)特性。

CH347 SPI接口

PIN腳 SPI功能腳 GPIO復(fù)用腳
5 SCS0 gpio2
9 SCS1 gpio5
6 SCK gpio0
8 MOSI -
7 MISO gpio1

SPI接口特性:

SPI模式0/1/2/3

SPI時鐘頻率60MHz/30MHz/15MHz/7.5MHz/3.75MHz/1.875MHz/937.5KHz/468.75KHz

MSB/LSB傳輸

8位/16位傳輸

2路片選

片選高/低有效

CH347 I2C接口

PIN腳 I2C功能腳 GPIO復(fù)用腳
11 SCL gpio3
12 SDA -

CH347支持4種I2C時鐘:20kHz,100kHz,400kHz和750kHz。該驅(qū)動會默認將I2C的時鐘初始化為100KHz,當前不支持動態(tài)修改該時鐘頻率,若需要修改可以在ch34x_mpsi_i2c_init函數(shù)中修改。

在Linux上增加對器件的驅(qū)動支持十分方便,只需要將該器件的設(shè)備驅(qū)動綁定到此Master驅(qū)動生成的總線下即可。舉例:

modprobe bmi160_i2c
echo "bmi160 0x68" > /sys/bus/i2c/devices/i2c-$DEV/new_device

modprobe tcs3472
echo "tcs3472 0x29" > /sys/bus/i2c/devices/i2c-$DEV/new_device

驅(qū)動創(chuàng)建的I2C設(shè)備文件在/sys/bus/i2c/devices/i2c-$DEV/ 目錄下

CH347 GPIO接口

PIN腳 GPIO復(fù)用腳
15 gpio4
2 gpio6
13 gpio7

CH347的硬件接口支持GPIO0~GPIO7,考慮到部分引腳被SPI和I2C的接口占用了,此驅(qū)動僅開放支持了GPIO4,GPIO6和GPIO7。

驅(qū)動操作說明

  • 使用“make”或者其他方式編譯此驅(qū)動,如果動態(tài)編譯成功會生成“ch34x_mpsi_master.ko”驅(qū)動模塊
  • 使用“sudo make load”或“sudo insmod ch34x_mpsi_master.ko”動態(tài)加載驅(qū)動,使用此方式加載SPI總線號和GPIO起始序號會自動分配,也可以通過增加參數(shù)進行指定。
  • 如:“sudo insmod ch34x_mpsi_master.ko spi_bus_num=3 gpio_base_num=60”
  • 使用“sudo make unload”或“sudo rmmod ch34x_mpsi_master.ko”卸載驅(qū)動
  • 使用“sudo make install”將驅(qū)動開機自動工作
  • 使用“sudo make uninstall”卸載該驅(qū)動

使用此驅(qū)動,需要確認CH347/CH341已經(jīng)插入主機并且工作正常,可以使用“l(fā)susb”或“dmesg”指令來確定,CH347/CH341的廠商VID是0x1A86。

如果芯片工作正常,可以使用“l(fā)s /sys/class/master”,“l(fā)s /sys/class/gpio”指令確認設(shè)備節(jié)點路徑。

用戶空間訪問

使用SPI接口

一旦驅(qū)動加載成功,默認會提供2個關(guān)聯(lián)到這個新的SPI Bus的SPI Slave設(shè)備,以CH347為例:

/dev/spidev0.0
/dev/spidev0.1

根據(jù)設(shè)備名稱規(guī)則 /dev/spidev.,是驅(qū)動自動選擇的總線號, 是芯片指定引腳的片選信號。

自linux內(nèi)核5.15開始綁定到spidev驅(qū)動需要主動bind使/dev目錄下設(shè)備可用,如bus 0下slave 1:

# echo spidev > /sys/class/spi_master/spi0/spi0.1/driver_override
# echo spi0.1 > /sys/bus/spi/drivers/spidev/bind

對所有ch34x_mpsi_master驅(qū)動管理的設(shè)備:

# for i in /sys/bus/usb/drivers/mpsi-ch34x/*/spi_master/spi*/spi*.*; do echo spidev > $i/driver_override; echo $(basename $i) > /sys/bus/spi/drivers/spidev/bind; done

標準I/O函數(shù)如 open, ioctl 和close 可以直接和該spi slave進行通訊,打開SPI設(shè)備:

int spi = open("/dev/spidev0.0", O_RDWR));

設(shè)備打開成功后,可以使用 ioctl函數(shù)修改SPI配置和傳輸數(shù)據(jù)等。

uint8_t mode = SPI_MODE_0;
uint8_t lsb = SPI_LSB_FIRST;
...
ioctl(spi, SPI_IOC_WR_MODE, &mode);
ioctl(spi, SPI_IOC_WR_LSB_FIRST, &lsb);

函數(shù) ioctl傳輸數(shù)據(jù)示例:

uint8_t *mosi; // output data
uint8_t *miso; // input data
...
// fill mosi with output data
...
struct spi_ioc_transfer spi_trans;
memset(&spi_trans, 0, sizeof(spi_trans));
?
spi_trans.tx_buf = (unsigned long) mosi;
spi_trans.rx_buf = (unsigned long) miso;
spi_trans.len = len;
?
int status = ioctl (spi, SPI_IOC_MESSAGE(1), &spi_trans);
?
// use input data in miso

掛載SPI NOR FLASH作為MTD存儲設(shè)備

舉例:flash器件掛載到bus 0 chip 0(spi0.0)

# echo spi0.0 > /sys/bus/spi/drivers/spidev/unbind
# echo spi-nor > /sys/bus/spi/devices/spi0.0/driver_override
# echo spi0.0 > /sys/bus/spi/drivers/spi-nor/bind

注:為方便用戶使用,該驅(qū)動默認會創(chuàng)建spidev設(shè)備,用戶可以使用上面的命令主動解綁與spidev的綁定,或者undefine在ch34x_mpsi_master_spi.c文件中的“SPIDEV”宏定義。

使用GPIO接口

用戶空間方位GPIO,可以使用sysfs,對驅(qū)動支持的GPIO,可在如下系統(tǒng)目錄下查看。

/sys/class/gpio/

是定義在驅(qū)動變量 ch347_board_config中的GPIO名稱 ,目錄包含

  • value 文件用于配置或讀取GPIO電平
  • edge文件用于配置GPIO中斷使能以及中斷類型
  • direction文件用于改變支持雙向GPIO的引腳方向

注:對文件的讀寫操作,用戶需要指定的讀寫權(quán)限。

當前支持的中斷類型包括:

  • rising 上升沿中斷
  • falling 下降沿中斷
  • both 雙邊沿中斷

打開GPIO

使用GPIO前,需要先打開value文件

int  fd;
?
if ((fd = open("/sys/class/gpio/value", O_RDWR)) == -1) 
{
   perror("open");
   return -1;
}

是GPIO的名稱

設(shè)置GPIO方向

配置GPIO方向為input或output,可在root權(quán)限下簡單地寫入in或out字符串到direction文件。

echo out > /sys/class/gpio/gpio4/direction

設(shè)置GPIO輸出

文件value打開后,可使用標準I/O函數(shù)進行讀寫,配置GPIO輸出電平,可簡單使用write函數(shù),寫入后GPIO會立刻輸出指定電平。

if (write(fd, value ? "1" : "0", 1) == -1) 
{
   perror ("write");
    return -1;
}

讀取GPIO電平

讀取GPIO電平,可簡單使用read函數(shù):

char buf;
?
if (read(fd, &buf, 1) == -1) 
{
   perror("read");
   return -1;
}
?
value = (buf == '0') ? 0 : 1;

每一次讀操作后,需要將文件位置指針需要重新定位到首字節(jié)。

if (lseek(fd, 0, SEEK_SET) == -1) {
   perror("lseek");
   return -1;
}

使用GPIO中斷

完整的使用GPIO中斷功能的驅(qū)動例程:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
?
#define GPIO_NUMBER 509 /* modify with actual gpio number */
?
static irqreturn_t gpio_interrupt(int irq, void *dev_id)
{
    printk("gpio_interrupt callback.n");
?
    return IRQ_HANDLED;
}
?
static int __init ch34x_gpio_init(void)
{
    unsigned long flags = IRQF_TRIGGER_FALLING;
    int ret;
    int irq;
?
    irq = gpio_to_irq(GPIO_NUMBER);
    printk("irq: %dn", irq);
    ret = gpio_request(GPIO_NUMBER, "gpioint");
    if (ret) {
        printk("gpio_request failed.n");
        goto exit;
    }
    ret = gpio_direction_input(GPIO_NUMBER);
    if (ret) {
        printk("gpio_direction_input failed.n");
        gpio_free(GPIO_NUMBER);
        goto exit;
    }
    irq_set_irq_type(irq, flags);
    ret = request_irq(irq, gpio_interrupt, 0, "gpio_handler", NULL);
    printk("%s - request_irq = %d result = %dn", __func__, irq, ret);
?
exit:
    return ret;
}
?
static void __exit ch34x_gpio_exit(void)
{
    int irq;
?
    irq = gpio_to_irq(GPIO_NUMBER);
    free_irq(irq, NULL);
    gpio_free(GPIO_NUMBER);
    printk("gpio driver exit.n");
}
?
module_init(ch34x_gpio_init);
module_exit(ch34x_gpio_exit);
?
MODULE_LICENSE("GPL");
?

注:該驅(qū)動默認會創(chuàng)建gpio設(shè)備,若需要在內(nèi)核中使用中斷功能,需要undefine在ch34x_mpsi_master_gpio.c中定義的“SYSFS_GPIO”宏。

CH341支持3種工作模式

模式0: [串口]

模式1: [SPI+ I2C + GPIO]

模式2: [打印口]

CH347支持4種模式

模式0: [串口* 2] VCP/CDC 驅(qū)動模式

模式1: [SPI + I2C + 串口* 1] VCP 驅(qū)動模式

模式2: [SPI + I2C + 串口* 1] HID 驅(qū)動模式

模式3: [JTAG + 串口* 1] VCP 驅(qū)動模式

該驅(qū)動只可工作在 ch341 模式1ch347 模式1

有技術(shù)問題,可以發(fā)郵件至技術(shù)郵箱: tech@wch.cn

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

    關(guān)注

    60

    文章

    7979

    瀏覽量

    265605
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11342

    瀏覽量

    210150
  • 主機
    +關(guān)注

    關(guān)注

    0

    文章

    1007

    瀏覽量

    35232
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1721

    瀏覽量

    91960
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1216

    瀏覽量

    52283
收藏 人收藏

    評論

    相關(guān)推薦

    GPIO模擬I2C總線的驅(qū)動設(shè)計與實現(xiàn)

    I2C總線簡單方便,是我們經(jīng)常使用的一種總線。但有時候我們的MCU沒有足夠多的I2C控制器來實現(xiàn)我們的應(yīng)用,所幸我可以使用普通的GPIO引腳來模擬低速的
    發(fā)表于 12-14 14:19 ?5439次閱讀
    <b class='flag-5'>GPIO</b>模擬<b class='flag-5'>I2C</b>總線的驅(qū)動設(shè)計與<b class='flag-5'>實現(xiàn)</b>

    南京沁恒微高速USB轉(zhuǎn)接芯片 CH347型號

    CH347是一款高速USB總線轉(zhuǎn)接芯片,通過USB總線提供異步串口、I2C同步串行接口、SPI同步串行接口和JTAG接口等。 在異步串口方式
    發(fā)表于 05-16 13:48

    PCA9698 I2C擴展芯片

    PCA9698 是一款40 位I2C 輸入/輸出擴展器,能夠實現(xiàn)I2C/SMBus 應(yīng)用中40 位GPIO
    發(fā)表于 11-10 14:24 ?88次下載

    I2C I/O擴展芯片特性分析

    簡介   I/O口擴展芯片可用于MCU/DSP通用I/O口的擴展,通過I2C擴展
    發(fā)表于 07-20 09:54 ?1.3w次閱讀

    EXAR推出基于I2CSPIGPIO擴展芯片

    EXAR 公司近日發(fā)布了XRA120x I2C/SMBus GPIO (通用輸入/輸出 )擴展芯片以及 XRA140x SPI GPIO
    發(fā)表于 10-14 09:09 ?3351次閱讀

    沁恒股份USB Android HOST芯片:CH9343概述

     CH9343是一個高度集成、低功耗、單芯片全速USB Android Host接口控制芯片,可配置為6種擴展接口:UART、GPIO、PWM、I2
    的頭像 發(fā)表于 11-04 14:11 ?2604次閱讀
    沁恒股份<b class='flag-5'>USB</b> Android HOST芯片:<b class='flag-5'>CH</b>9343概述

    STM32 通用GPIO模擬I2C實現(xiàn)

    STM32 模擬I2C實現(xiàn)#通用GPIO模擬I2C通信實現(xiàn)樣例1 GPIO初始化``#ifdef
    發(fā)表于 11-29 15:21 ?29次下載
    STM32 通用<b class='flag-5'>GPIO</b>模擬<b class='flag-5'>I2C</b><b class='flag-5'>實現(xiàn)</b>

    詳細介紹GPIOI2CSPI通訊原理以及物理層原理

    6. I2C接口工作模式7. 硬件拉高拉低的過程8. 一對多9. 開發(fā)流程三. SPI1. 什么是SPI2. SPI優(yōu)與缺點3.
    發(fā)表于 12-05 12:51 ?21次下載
    詳細介紹<b class='flag-5'>GPIO</b>、<b class='flag-5'>I2C</b>、<b class='flag-5'>SPI</b>通訊原理以及物理層原理

    詳細介紹GPIOI2CSPI通訊原理以及物理層原理

    6. I2C接口工作模式7. 硬件拉高拉低的過程8. 一對多9. 開發(fā)流程三. SPI1. 什么是SPI2. SPI優(yōu)與缺點3.
    發(fā)表于 12-05 13:21 ?9次下載
    詳細介紹<b class='flag-5'>GPIO</b>、<b class='flag-5'>I2C</b>、<b class='flag-5'>SPI</b>通訊原理以及物理層原理

    高速USB總線轉(zhuǎn)接芯片CH347概述、特點及封裝

    CH347是一款高速USB總線轉(zhuǎn)接芯片,通過USB總線提供異步串口、I2C同步串行接口、SPI同步串行接口和JTAG接口等。
    的頭像 發(fā)表于 06-28 10:33 ?3881次閱讀
    高速<b class='flag-5'>USB</b>總線轉(zhuǎn)接芯片<b class='flag-5'>CH347</b>概述、特點及封裝

    高速USB轉(zhuǎn)接芯片CH347技術(shù)手冊

    電子發(fā)燒友網(wǎng)站提供《高速USB轉(zhuǎn)接芯片CH347技術(shù)手冊.pdf》資料免費下載
    發(fā)表于 09-09 15:29 ?7次下載
    高速<b class='flag-5'>USB</b>轉(zhuǎn)接芯片<b class='flag-5'>CH347</b>技術(shù)手冊

    Gowin I2C Master/Slave用戶指南

    Gowin I2C Master 和 Slave 用戶指南主要包括功能簡介、信號定義、工 作原理、實例化等,旨在幫助用戶快速了解 Gowin I2C Master IP 和 Slav
    發(fā)表于 09-15 10:07 ?1次下載
    Gowin <b class='flag-5'>I2C</b> <b class='flag-5'>Master</b>/Slave用戶指南

    高速USB轉(zhuǎn)接芯片沁恒CH347介紹

    高速USB轉(zhuǎn)接芯片沁恒CH347-國內(nèi)唯一USB轉(zhuǎn)SPIUSB轉(zhuǎn)I2C
    發(fā)表于 10-10 16:25 ?1728次閱讀
    高速<b class='flag-5'>USB</b>轉(zhuǎn)接芯片沁恒<b class='flag-5'>CH347</b>介紹

    高速USB轉(zhuǎn)接芯片 CH347

    CH347 是一款高速 USB 總線轉(zhuǎn)接芯片,通過 USB 總線提供異步串口、I2C 同步串行接口、SPI 同 步串行接口和 JTAG 接口
    的頭像 發(fā)表于 04-28 11:27 ?3073次閱讀
    高速<b class='flag-5'>USB</b>轉(zhuǎn)接芯片 <b class='flag-5'>CH347</b>

    探索GPIO/ADC/LED/I2C/SPI/USB…的完整世界

    今天了解的是GPIO/ADC/LED/I2C/SPI/USB硬件接口設(shè)計及其注意事項,希望對大家有所幫助。
    的頭像 發(fā)表于 11-17 09:59 ?463次閱讀
    探索<b class='flag-5'>GPIO</b>/ADC/LED/<b class='flag-5'>I2C</b>/<b class='flag-5'>SPI</b>/<b class='flag-5'>USB</b>…的完整世界
    主站蜘蛛池模板: 亚洲成熟人网站 | 韩国精品韩国专区久久 | 精品久久久99大香线蕉 | 果冻传媒在线观看资源七夕 | 天天影视香色欲综合网 | 99久久精品6在线播放 | 久久免费精品视频 | 国产强奷糟蹋漂亮邻居在线观看 | 伊人国产视频 | 亚洲精品国产在线观看 | 夜夜女人国产香蕉久久精品 | 永久免费毛片 | 再插深点嗯好大好爽 | 成人高清护士在线播放 | 大乳牛奶女在线观看 | 韩国演艺圈悲惨在线 | 国产亚洲精品黑人粗大精选 | 无码国产成人777爽死在线观看 | 色裕插插插影视 | 国产成人v视频在线观看 | 国产一区二区三区乱码在线观看 | 亚洲欧美中文日韩v在线 | jizzjizz中国大学生 | 精品性影院一区二区三区内射 | 国产精品嫩草免费视频 | 国产无遮挡无码视频在线观看不卡 | 国产一在线精品一区在线观看 | 欧美性爱 先锋影音 | 精品无码久久久久久国产百度 | free俄罗斯性xxxxhd派对 | 久久re这里视频只有精品首页 | 国产色情短视频在线网站 | a视频在线看| 久草草在线视视频 | 老司机试看午夜 | 亚洲色大成网站WWW永久麻豆 | 少女10声大哥喊退色狼 | 四虎影5151毛片在线看 | 中文字幕亚洲欧美日韩2o19 | 公和我做好爽添厨房中文字幕 | 在线播放一区二区精品产 |