SylixOS下I2C總線適配器接口

I2C 總線適配器相關信息位於“libsylixos/SylixOS/system/device/i2c”下,其適配器創建函數原型如下:

#include <SylixOS.h>
INT API_I2cAdapterCreate (CPCHAR          pcName, 
                          PLW_I2C_FUNCS   pi2cfunc,
                          ULONG           ulTimeout,
                          INT             iRetry)

函數 API_I2cAdapterCreate 原型分析:

  • 此函數成功返回 ERROR_NONE,失敗返回 PX_ERROR;
  • 參數 pcName 是 I2C 適配器的名稱,即 shell 命令 buss 顯示的名稱;
  • 參數 pi2cfunc 是 I2C 總線傳輸函數的指針;
  • 參數 ulTimeout 是操作超時時間;
  • 參數 iRetry 是傳輸出錯時的重試次數。

函數 API_I2cAdapterCreate使用結構體PLW_I2C_FUNCS 來向內核提供傳輸函數集合,其詳細描述如下:

#include <SylixOS.h>
typedef struct lw_i2c_funcs {
 INT (*I2CFUNC_pfuncMasterXfer)(PLW_I2C_ADAPTER pi2cadapter,
                                PLW_I2C_MESSAGE pi2cmsg,
                                INT             iNum);
 INT (*I2CFUNC_pfuncMasterCtl)(PLW_I2C_ADAPTER  pi2cadapter,
                               INT              iCmd,
                               LONG             lArg);
} LW_I2C_FUNCS;
typedef LW_I2C_FUNCS *PLW_I2C_FUNCS;
  • I2CFUNC_pfuncMasterXfer:I2C 傳輸函數,I2C 設備會直接調用此函數實現消息發
    送。
    第一個參數 pi2cadapter 爲 I2C 總線適配器指針,
    第二個參數 pi2cmsg 爲 I2C 設備需要傳輸的消息結構體首地址指針,
    第三個參數 iNum 爲需要傳輸的消息個數,
    通過以上三個參數即可知道 I2C 設備如何調用此函數實現消息傳輸;
  • I2CFUNC_pfuncMasterCtl:I2C 適配器控制函數,用來實現與硬件控制器相關的控
    制。
    第一個參數 pi2cadapter 爲 I2C 總線適配器指針,
    第二個參數 iCmd 爲控制命令,
    第三個參數 lArg 與 iCmd 相關。
    注意:I2CFUNC_pfuncMasterCtl 函數是按照開發人員的需求實現,通常情況下不實現。

註冊到內核的傳輸函數集合中要用到多種結構體,
PLW_I2C_ADAPTER 總線適配器結構體指針主要包含當前總線適配器節點信息,
PLW_I2C_DEVICE 總線設備結構體指針主要包含當前 I2C 設備的相關信息,
PLW_I2C_MESSAGE 消息請求結構體指針作用是指向需要發送的消息緩衝區,
提供以上三種結構體後控制器即可知道如何進行發送,各種結構體的詳細描述如下:

首先介紹 I2C 總線適配器結構體,該結構體詳細描述如下:

typedef struct lw_i2c_adapter {
 LW_BUS_ADAPTER            I2CADAPTER_pbusadapter; /* 總線節點 */
 struct lw_i2c_funcs      *I2CADAPTER_pi2cfunc; /* 總線適配器操作函數 */
 LW_OBJECT_HANDLE          I2CADAPTER_hBusLock; /* 總線操作鎖 */
 ULONG                     I2CADAPTER_ulTimeout; /* 操作超時時間 */
 INT                       I2CADAPTER_iRetry; /* 重試次數 */
 LW_LIST_LINE_HEADER       I2CADAPTER_plineDevHeader; /* 設備鏈表 */
} LW_I2C_ADAPTER;
typedef LW_I2C_ADAPTER *PLW_I2C_ADAPTER;
  • I2CADAPTER_pbusadapter:系統總線節點結構體;
  • I2CADAPTER_pi2cfunc:指向總線適配器的操作函數,即 API_I2cAdapterCreate 函數註冊到核心層的操作函數集指針;
  • I2CADAPTER_hBusLock:I2C 總線鎖,不需要手動處理;
  • I2CADAPTER_ulTimeout:操作超時時間;
  • I2CADAPTER_iRetry:傳輸出錯時的重試次數;
  • I2CADAPTER_plineDevHeader:指向此適配器下掛載的設備鏈表,不需要手動處理。

I2C 設備結構體的詳細描述如下:

typedef struct lw_i2c_device {
 UINT16              I2CDEV_usAddr; /* 設備地址 */
 UINT16              I2CDEV_usFlag; /* 標誌, 僅支持 10bit 地址選項*/
#define LW_I2C_CLIENT_TEN 0x10 /* 與 LW_I2C_M_TEN 相同 */
 PLW_I2C_ADAPTER     I2CDEV_pi2cadapter; /* 掛載的適配器 */
 LW_LIST_LINE        I2CDEV_lineManage; /* 設備掛載鏈 */
 atomic_t            I2CDEV_atomicUsageCnt; /* 設備使用計數 */
 CHAR                I2CDEV_cName[LW_CFG_OBJECT_NAME_SIZE]; /* 設備的名稱 */
} LW_I2C_DEVICE;
typedef LW_I2C_DEVICE *PLW_I2C_DEVICE;
  • I2CDEV_usAddr:設備地址;
  • I2CDEV_usFlag:若從設備的地址爲 10bit,則將該標誌位值置爲LW_I2C_CLIENT_TEN;否則置爲 0;
  • I2CDEV_pi2cadapter:設備掛載的 I2C 總線適配器;
  • I2CDEV_lineManage:設備掛載的鏈表;
  • I2CDEV_atomicUsageCnt:設備使用的計數;
  • I2CDEV_cName:設備名稱;

I2C 消息結構體是 I2C 主機和從機通信的消息格式,該結構體的詳細描述如下:

typedef struct lw_i2c_message {
UINT16      I2CMSG_usAddr; /* 器件地址 */
UINT16      I2CMSG_usFlag; /* 傳輸控制參數 */
UINT16      I2CMSG_usLen; /* 長度(緩衝區大小) */
UINT8      *I2CMSG_pucBuffer; /* 緩衝區 */
} LW_I2C_MESSAGE;
typedef LW_I2C_MESSAGE *PLW_I2C_MESSAGE;
  • I2CMSG_usAddr:器件地址;
  • I2CMSG_usFlag:傳輸控制參數,其取值見表 12.1;
  • I2CMSG_usLen:存放消息內容的緩存區大小;
  • I2CMSG_pucBuffer:存放消息內容的緩存區。

表 12.1 I2C 傳輸控制參數取值

傳輸控制參數的值 含義
LW_I2C_M_TEN 使用 10bit 設備地址
LW_I2C_M_RD 爲讀操作,否則爲寫
LW_I2C_M_NOSTART 不發送 start 標誌
LW_I2C_M_REV_DIR_ADDR 讀寫標誌位反轉
LW_I2C_M_IGNORE_NAK 忽略 ACK NACK
LW_I2C_M_NO_RD_ACK 讀操作時不發送 ACK
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章