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 |