一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

基于zynq的IIC驅(qū)動的內(nèi)容和機制

454398 ? 來源:AI加速 ? 作者:AI加速 ? 2020-11-30 15:45 ? 次閱讀

本文主要介紹基于zynq的IIC的驅(qū)動架構(gòu),通過代碼編寫來深入了解IIC驅(qū)動的內(nèi)容和機制。

1. IIC驅(qū)動架構(gòu)

IIC驅(qū)動包含兩部分:IIC總線驅(qū)動和設(shè)備驅(qū)動。總線驅(qū)動是對硬件設(shè)備適配器端的實現(xiàn),主要包含i2c_adapter,i2c_algorithm和控制i2c適配器產(chǎn)生通信信號的函數(shù)。I2c_adapter和一套i2c讀寫algorithm綁定,i2c_algorithm包含對i2c總線的訪問方式。IIC總線驅(qū)動完成i2c_driver的注冊,IO空間分配,IIC硬件設(shè)備時鐘的設(shè)定,主從模式以及收發(fā)模式的設(shè)定等。通過i2c_adapter可以控制I2C總線上開始,結(jié)束等信號的產(chǎn)生。

IIC設(shè)備驅(qū)動提供用戶空間和i2c總線驅(qū)動的交互,其定義了i2c_client數(shù)據(jù)結(jié)構(gòu)以及文件操作ioctrl,open,write等。I2c_client依附于i2c_adapter,用戶通過i2c_client結(jié)構(gòu)來調(diào)用相應(yīng)的i2c_adapter,來實現(xiàn)IIC控制。具體層次結(jié)構(gòu)如下:

User ioctrl--------->

I2c_client------------>

I2c_adapter------------>

I2c_algorithm--------------->

IIC硬件

2. zynq上IIC驅(qū)動試驗

基于黑金的zynq7020開發(fā)板,通過IIC來讀寫EEPROM,首先在PS端選擇IIC端口,導(dǎo)出到PL端,分配引腳。

代碼分析:

首先定義一個i2c_dev,用于綁定到platfrom總線上。結(jié)構(gòu)體中包含i2c_adapter,以及用于收發(fā)數(shù)據(jù)的buffer(p_send_buf和p_recv_buf),completion用于等待數(shù)據(jù)發(fā)送過程。

struct eeprom_i2c_dev{
struct device *dev;
struct i2c_adapter adapter;
unsigned long size;
void __iomem *baddr;
struct i2c_msg *p_msg;
unsigned char *p_send_buf;
unsigned char *p_recv_buf;
unsigned int recv_cnt;
unsigned int send_cnt;
int hold_falg;
int irq;
struct completion msg_completion;
spinlock_t xfer_lock;
u32 i2c_clk;
u32 input_clk;
struct clk *clk;
u32 ctrl_reg;
};

I2c_driver中主要包含了驅(qū)動注冊和卸載函數(shù)。

static struct platform_driver eeprom_i2c_driver = {
.driver={
.name=DRIVER_NAME,
.owner=THIS_MODULE,
.of_match_table=eeprom_i2c_of_match,
},
.probe=eeprom_i2c_probe,
.remove=eeprom_i2c_remove,
};

現(xiàn)在分析probe函數(shù):

首先從設(shè)備樹中獲得內(nèi)存地址以及中斷號,并分配IO虛擬內(nèi)存。

static int eeprom_i2c_probe(struct platform_device *pdev){
……
res=platform_get_resource(pdev, IORESOURCE_MEM, 0);
……
base=ioremap(res->start, resource_size(res));
……
res=platform_get_resource(pdev, IORESOURCE_IRQ, 0);

指定i2c_adapter的i2c_algorithm。

idev->adapter.owner = THIS_MODULE;
idev->adapter.dev.of_node = pdev->dev.of_node;
idev->baddr=base;
idev->irq=irq;
idev->size=size;
idev->dev=&pdev->dev;
idev->adapter.timeout=msecs_to_jiffies(1000);
idev->adapter.algo=&eeprom_i2c_algo;
idev->adapter.algo_data = idev;
idev->adapter.dev.parent = &pdev->dev;
snprintf(idev->adapter.name, sizeof(idev->adapter.name), "EEPROM I2C at %08lx", strt_addr);

根據(jù)設(shè)備樹中時鐘配置IIC硬件中的時鐘寄存器。

idev->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(idev->clk)) {
dev_err(&pdev->dev, "input clock not found./n");
return PTR_ERR(idev->clk);
} ret=clk_prepare_enable(idev->clk);
if(ret)
dev_err(&pdev->dev, "unable to enable clcok/n");
idev->input_clk=clk_get_rate(idev->clk);
idev->ctrl_reg = EEPROM_I2C_CR_ACK_EN | EEPROM_I2C_CR_NEA | EEPROM_I2C_CR_MS;
ret=eeprom_i2c_setclk(idev->input_clk, idev);

IIC接收數(shù)據(jù)要申請中斷。

ret=devm_request_irq(&pdev->dev, irq, eeprom_i2c_irq, 0, DRIVER_NAME, idev);

i2c_add_adapter用于將i2c_adapter加入到總線中。這個時候i2c_dev.c是可以通過通知連來檢測到這個i2c_adapter的,并能為其分配設(shè)備號。然后用戶就可以通過直接操作這個設(shè)備來實現(xiàn)IIC讀寫了。

接下來看i2c_algorithm:

static const struct i2c_algorithm eeprom_i2c_algo = {
.master_xfer=eeprom_i2c_master_xfer,
.functionality=eeprom_i2c_func,
};

eeprom_i2c_master_xfer是通信函數(shù),其中有:

eeprom_i2c_mrcv用于處理接收到IIC設(shè)備數(shù)據(jù),eeprom_i2c_msend用于處理發(fā)送數(shù)據(jù),函數(shù)主要通過配置IIC硬件設(shè)備中寄存器來實現(xiàn)。

現(xiàn)在來看用戶如何操作IIC:

i2c_rdwr_ioctl_data是i2c_dev.c中用于存儲的收發(fā)數(shù)據(jù)的結(jié)構(gòu),通過它可以傳遞數(shù)據(jù)。在work_queue中的msgs中設(shè)定好slave_addr,len等值,然后通過ioctrl可以讀寫IIC了。

編輯:hfy

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

    關(guān)注

    1

    文章

    67

    瀏覽量

    20668
  • Zynq
    +關(guān)注

    關(guān)注

    10

    文章

    614

    瀏覽量

    47894
  • IIC驅(qū)動程序
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5092
收藏 人收藏

    評論

    相關(guān)推薦

    基于Zynq的OLED驅(qū)動設(shè)計

    目前OLED的驅(qū)動大部分都是基于STM系列ARM芯片和傳統(tǒng)FPGA芯片。為適應(yīng)Xilinx最新平臺Zynq的人機交互需要,提出一種基于Zynq的OLED驅(qū)動設(shè)計方法。##
    發(fā)表于 09-04 16:16 ?1.1w次閱讀

    ZYNQ FPGA的PS端IIC設(shè)備接口使用

    zynq系列中的FPGA,都會自帶兩個iic設(shè)備,我們直接調(diào)用其接口函數(shù)即可運用。使用xilinx官方提供的庫函數(shù),開發(fā)起來方便快捷。
    的頭像 發(fā)表于 04-17 11:26 ?777次閱讀
    <b class='flag-5'>ZYNQ</b> FPGA的PS端<b class='flag-5'>IIC</b>設(shè)備接口使用

    請問IO口模擬IIC協(xié)議仲裁機制怎么編寫?

    IO口模擬IIC協(xié)議仲裁機制如何編寫?
    發(fā)表于 03-28 23:25

    ZYNQ PS端IIC接口使用筆記分享

    ZYNQ7000系列FPGA的PS自帶兩個IIC接口,接口PIN IO可擴展為EMIO形式即將IO約束到PL端符合電平標(biāo)準的IO(BANK12、BANK13、BANK34、BANK35);SDK中
    發(fā)表于 12-23 17:06

    ZYNQ PS端IIC接口使用筆記分享

      ZYNQ7000系列FPGA的PS自帶兩個IIC接口,接口PIN IO可擴展為EMIO形式即將IO約束到PL端符合電平標(biāo)準的IO(BANK12、BANK13、BANK34、BANK35
    發(fā)表于 01-08 16:44

    ZYNQ PS端IIC接口怎么使用?

    ZYNQ PS端IIC接口使用筆記
    發(fā)表于 02-23 06:23

    ARM-Linux-IIC設(shè)備的添加與驅(qū)動實現(xiàn)

    本文分析了ARM-Linux下IIC總線及其設(shè)備驅(qū)動的層次結(jié)構(gòu),指出了IIC設(shè)備添加與驅(qū)動實現(xiàn)的途徑,詳細闡述了如何采用通用i2c-dev.c驅(qū)動
    發(fā)表于 06-13 14:37 ?57次下載
    ARM-Linux-<b class='flag-5'>IIC</b>設(shè)備的添加與<b class='flag-5'>驅(qū)動</b>實現(xiàn)

    iic驅(qū)動

    IIC驅(qū)動,含I2C的源碼,MCU模擬IIC通訊函數(shù),要改變傳輸頻率,請修改延時函數(shù)中的數(shù)值即可
    發(fā)表于 07-04 17:57 ?10次下載

    IIC總線初始化基本驅(qū)動參考程序應(yīng)用代碼免費下載

    本文檔的主要內(nèi)容詳細介紹的是IIC總線初始化基本驅(qū)動參考程序應(yīng)用代碼免費下載。程序功能:為IIC總線的基本驅(qū)動程序(此程序沒有寫主函數(shù),只是
    發(fā)表于 01-16 08:00 ?5次下載
    <b class='flag-5'>IIC</b>總線初始化基本<b class='flag-5'>驅(qū)動</b>參考程序應(yīng)用代碼免費下載

    使用51單片機進行IIC和EEPROM的驅(qū)動程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機進行IIC和EEPROM的驅(qū)動程序免費下載。
    發(fā)表于 06-17 17:44 ?1次下載
    使用51單片機進行<b class='flag-5'>IIC</b>和EEPROM的<b class='flag-5'>驅(qū)動</b>程序免費下載

    使用IIC24C04芯片驅(qū)動數(shù)碼管的程序和仿真電路圖

    本文檔的主要內(nèi)容詳細介紹的是使用IIC24C04芯片驅(qū)動數(shù)碼管的程序和仿真電路圖。
    發(fā)表于 07-10 14:28 ?14次下載
    使用<b class='flag-5'>IIC</b>24C04芯片<b class='flag-5'>驅(qū)動</b>數(shù)碼管的程序和仿真電路圖

    Zynq-7000 PS端IIC接口使用筆記

    ZYNQ7000系列FPGA的PS自帶兩個IIC接口,接口PIN IO可擴展為EMIO形式即將IO約束到PL端符合電平標(biāo)準的IO(BANK12、BANK13、BANK34、BANK35);SDK中
    的頭像 發(fā)表于 07-25 17:56 ?2613次閱讀
    <b class='flag-5'>Zynq</b>-7000 PS端<b class='flag-5'>IIC</b>接口使用筆記

    ZYNQ PS端IIC接口使用筆記

    ZYNQ7000系列FPGA的PS自帶兩個IIC接口,接口PIN IO可擴展為EMIO形式即將IO約束到PL端符合電平標(biāo)準的IO(BANK12、BANK13、BANK34、BANK35);SDK中
    發(fā)表于 01-28 08:05 ?25次下載
    <b class='flag-5'>ZYNQ</b> PS端<b class='flag-5'>IIC</b>接口使用筆記

    STM32開發(fā)中使用C語言實現(xiàn)IIC驅(qū)動

    簡述 IIC(Inter-Integrated Circuit)其實是IICBus簡稱,它是一種串行通信總線,使用多主從架構(gòu),在STM32開發(fā)中經(jīng)常見到。 使用面向?qū)ο蟮木幊趟枷敕庋bIIC驅(qū)動,將
    的頭像 發(fā)表于 06-21 14:58 ?3670次閱讀

    使用IIC驅(qū)動MPU6050時為什么總讀取失敗

    在使用IIC讀取RTC芯片時遇到的問題,并成功解決。 我以為我已經(jīng)完全學(xué)會了IIC,但現(xiàn)實卻打了臉,我在使用《STM32IIC詳解》文中的IIC驅(qū)動
    的頭像 發(fā)表于 11-06 10:10 ?7572次閱讀
    使用<b class='flag-5'>IIC</b>去<b class='flag-5'>驅(qū)動</b>MPU6050時為什么總讀取失敗