日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 默认站点!

默认站点

當前位置: 首頁 >

controller控制器怎么写_I2C控制器编程_框架

發布時間:2023/11/30 38 豆豆
默认站点 收集整理的這篇文章主要介紹了 controller控制器怎么写_I2C控制器编程_框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:百問網_嵌入式Linux wiki_jz2440 新1期視頻維基教程 (視頻文字版)

作者:韋東山

本文字數:3776,閱讀時長:5分鐘

我們現在來講I2C控制器怎么寫,它是I2C程序中最核心的地方,我們要先構造幾個結構體,這幾個結構體放在i2c_controller.h里面。

我們要發出I2c傳輸時,要構造出i2c_msg,把構造出的i2c_msg扔給下面的i2c_controller.c,i2c_controller.c會選擇某一個i2c控制器,使用里面的master_xfer來傳輸數據, 所以我們需要構造出一個i2c_controller結構體。

i2c_controller.h文件

文件的內容如下所示:

#ifndef _I2C_CONTROLLER_H#define _I2C_CONTROLLER_Htypedef struct i2c_msg {unsigned int addr; /* 7bits */int flags; /* 0 - write, 1 - read */int len;int cnt_transferred;unsigned char *buf;}i2c_msg, *p_i2c_msg;typedef struct i2c_controller {int (*int)(void);int (*master_xfer)(i2c_msg msgs, int num);char *name;}i2c_controller, *p_i2c_controller;#endif /* _I2C_CONTROLLER_H */

解析:我們構造這兩個結構體,我們要把它放在i2c_controller.c把它用起來,

i2c_controller.c文件

文件的內容如下所示:

include "i2c_controller.h"#define I2C_CONTROLLER_NUM 10/* 有一個i2c_controller數組用來存放各種不同芯片的操作結構體 */static p_i2c_controller p_i2c_controllers[I2C_CONTROLLER_NUM];static p_i2c_controller p_i2c_con_selected;void register_i2c_controller(p_i2c_controller *p){int i;for (i = 0; i < I2C_CONTROLLER_NUM; i++){if (!p_i2c_controllers[i]){p_i2c_controllers[i] = p;return;}}}

解析:register_i2c_controller函數用于把參數中的結構體指針,注冊到p_i2c_controllers指針數組中。

/* 根據名字來選擇某款I2C控制器 */int select_i2c_controller(char *name){int i;for (i = 0; i < I2C_CONTROLLER_NUM; i++){if (p_i2c_controllers[i] && !strcmp(name, p_i2c_controllers[i]->name)){p_i2c_con_selected = p_i2c_controllers[i];return 0;}}return -1;}

解析:select_i2c_controller函數根據參數中的名字(name) 從p_i2c_controllers指針數組中取出對應的結構體指針復制給p_i2c_con_selected結構體指針(靜態全局變量)。

/* 實現 i2c_transfer 接口函數 */int i2c_transfer(i2c_msg msgs, int num){return p_i2c_con_selected->master_xfer(msgs, num);}

解析:i2c_transfer接口函數,調用選擇的p_i2c_con_selected成員中master_xfer函數。

void i2c_init(void){/* 注冊下面的I2C控制器 */s3c2440_i2c_con_add();/* 選擇某款I2C控制器 *//* 調用它的init函數 */}

解析:s3c2440_i2c_con_add()函數,把定義的s3c2440_i2c_con結構體注冊到p_i2c_controllers數組中。

s3c2440_i2c_controller.c文件

中斷服務函數,當發成中斷時,就會調用中斷服務函數,代碼如下

void i2c_interrupt_func(int irq){/* 每傳輸完一個數據將產生一個中斷 *//* 對于每次傳輸, 第1個中斷是"已經發出了設備地址" */}

s3c2440_i2c_con_init函數,用來初始化I2C,控制器代碼如下:

void s3c2440_i2c_con_init(void){/* 設置時鐘 *//* [7] : IIC-bus acknowledge enable bit, 1-enable in rx mode * [6] : 時鐘源, 0: IICCLK = fPCLK /16; 1: IICCLK = fPCLK /512 * [5] : 1-enable interrupt * [4] : 讀出為1時表示中斷發生了, 寫入0來清除并恢復I2C操作 * [3:0] : Tx clock = IICCLK/(IICCON[3:0]+1). * Tx Clock = 100khz = 50Mhz/16/(IICCON[3:0]+1) */IICCON = (0<<6) | (1<<5) | (30<<0);/* 注冊中斷處理函數 */register_irq(27, i2c_interrupt_func);}

解析:

1).IICCON = (0<<6) | (1<<5) | (30<<0); 設置IICCON控制寄存器。選擇發送時鐘,使能中斷。

2).register_irq(27, i2c_interrupt_func):注冊中斷處理函數,當發生I2C中斷的時候就會調用i2c_interrupt_func中斷處理函數。

初始化完成后,就可以調用do_master_tx寫I2C從機了,這個函數僅僅啟動I2C傳輸,然后等待,直到數據在中斷服務程序中傳輸完畢后再返回。函數代碼如下:

void do_master_tx(p_i2c_msg msg){msg->cnt_transferred = 0;/* 設置寄存器啟動傳輸 *//* 1. 配置為 master tx mode *//* 2. 把從設備地址寫入IICDS */IICDS = msg->addr<<1;/* 3. IICSTAT = 0xf0 , 數據即被發送出去, 將導致中斷產生 */IICSTAT = 0xf0;/* 后續的傳輸由中斷驅動 *//* 循環等待中斷處理完畢 */while (msg->cnt_transferred != msg->len);}

解析:

1).IICDS = msg->addr<<1: 把從機地址(高7位,所以需要向右移一位)寫入到IICDS寄存器中。

2).IICSTAT = 0xf0:設置IICSTAT寄存器,將s3c2440設為主機發送器,并發出S信號后,緊接著就發出從機地址。后續的傳輸工作將在中斷服務程序中完成。

do_master_rx函數的實現和do_master_tx函數類似,代碼如下:

void do_master_rx(p_i2c_msg msg){msg->cnt_transferred = 0;/* 設置寄存器啟動傳輸 *//* 1. 配置為 Master Rx mode *//* 2. 把從設備地址寫入IICDS */IICDS = (msg->addr<<1)|(1<<0);/* 3. IICSTAT = 0xb0 , 從設備地址即被發送出去, 將導致中斷產生 */IICSTAT = 0xb0;/* 后續的傳輸由中斷驅動 *//* 循環等待中斷處理完畢 */while (msg->cnt_transferred != msg->len);}

解析: 1).IICDS = (msg->addr<<1)|(1<<0):把從設備地址寫入IICDS,前7位是從機地址,第8位表示傳輸方向(0表示寫操作,1表示讀操作)。

s3c2440傳輸函數,根據標志位flags,來指明是讀/寫(1:讀 0:寫)。代碼如下:

int s3c2440_master_xfer(p_i2c_msg msgs, int num){int i;for (i = 0; i < num; i++){if (msgs[i]->flags == 0)/* write */do_master_tx(msgs[i]);elsedo_master_rx(msgs[i]);}}

我們定義一個i2c_controller結構體s3c2440_i2c_con。下面的代碼對他進行初始化。

static i2c_controller s3c2440_i2c_con = {.name = "s3c2440",.init = s3c2440_i2c_con_init,.master_xfer = s3c2440_master_xfer,};

s3c2440_i2c_con_add函數把上面定義的s3c2440_i2c_con結構體注冊到上層的i2c_controller數組中。

void s3c2440_i2c_con_add(void){register_i2c_controller(&s3c2440_i2c_con);}

「新品首發」STM32MP157開發板火爆預售!首批僅300套

總結

以上是默认站点為你收集整理的controller控制器怎么写_I2C控制器编程_框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得默认站点網站內容還不錯,歡迎將默认站点推薦給好友。