?? i2c.h
字號:
#ifndef I2C_H
#define I2C_H
enum TI2CErrorCode
{
IE_OK, //0 正常
IE_IN_PROGRESS, //1 正在操作
IE_TIME_OUT, //2 執行等待超時
IE_DEVICE_ERROR, //3 讀寫器件過程中出錯
IE_INALID_WRITE_MODE, //4 中斷進入寫模式,但是沒有字節可寫
IE_INALID_READ_MODE, //5 中斷進入讀模式,但是沒有字節可讀
IE_CANNOT_SEND_START_STOP,//6 無法發送停止條件或者起始條件,總線紊亂了。內部會自動復位
IE_UNKOWN_ISR_STATE //7 發生了未知原因的中斷
};
//I2C 總線速度設置
#define FI2C0 350000
//I2C 總線一次可以添加幾個操作
#define MAX_I2C_OPERATION_COUNT 5
class CAbsI2CBus
{
public:
/*----------------- 添加I2C總線的操作 --------------------------
參數說明:
slave_addr - I2c總線設備的地址
buf - 讀寫的緩沖區
len - 緩沖區長度
append_stop - 讀寫完畢后是否發送停止條件
返回:
如果成功添加了操作,則返回true,否則返回false
說明:
操作添加后不會立刻執行,而是在調用Execute 時執行
如果調用 Execute 時不等待,則調用者必須保證buf指向的內容保持有效。
執行 Execute 后,再調用 AddOp_xx 函數則以前添加的操作都將被覆蓋
StartXXXX 函數:
. 先發送起始條件(如果上次沒有結束,自動先發送停止條件
. 再發送從機地址
. 可選是否發送數據
. 可選的是否發送停止條件
ContinueXXXX 函數:
. 如果上次也是讀寫,才能成功添加該操作
. 讀寫后可選擇是否發送停止條件
有關STOP的說明:
. StartRead, StartWrite 結束后如果不附加STOP,則可以繼續調用 ContinueRead 和 ContinueWrite。
. StartRead 后如果不附加 STOP,而馬上調用 StartWrite, 則必須附加STOP,程序會自動
再多讀取一個字節并且不返回確認,然后才能發送停止條件.
------------------------------------------------------------*/
virtual bool AddOp_StartRead(uint8 slave_addr, __packed uint8 *buf, int len, bool append_stop) = 0;
virtual bool AddOp_StartWrite(uint8 slave_addr, __packed uint8 *buf, int len, bool append_stop) = 0;
virtual bool AddOp_ContinueRead(__packed uint8 *buf, int len, bool append_stop) = 0;
virtual bool AddOp_ContinueWrite(__packed uint8 *buf, int len, bool append_stop) = 0;
virtual bool AddOp_Stop() = 0;//發送停止條件
/*----------------- 執行I2C總線操作 --------------------------
參數說明:
time_out_in_ms - 執行超時時間。例如EEPROM 寫操作需要5毫秒。
block - 是否等待總線操作完畢后才退出。
如果為 true,則等待直到I2C總線操作完成或者超時才返回
如果為 false,則啟動總線操作后立刻返回。調用者必須保證
操作的緩沖區保持有效(例如StartWrite 函數的buf 所指向的內容),
否則會產生意外結果。
返回:
返回錯誤代碼。正常為 IE_OK
說明:
如果連續調用 Execute 函數,則重新開始執行上次添加好的操作,而如果當前的操作
正在執行,則先發送停止條件。
例子:
讀取24C64:
1. 發送起始條件+從機地址寫+內存地址+停止
AddOp_StartWrite(0XA0, &addr, 1,true);
2. 發送起始條件+從機地址讀+讀取N字節
AddOp_StartRead(0XA0, buf, len,true);
3. 啟動操作
Execute();
------------------------------------------------------------*/
virtual TI2CErrorCode Execute(uint32 time_out_in_ms = 20, bool block=true) = 0;
/*----------------- 讀取操作結果 --------------------------
參數說明:
time_out_in_ms - 執行超時時間。例如EEPROM 寫操作需要5毫秒。
block - 是否等待總線操作完畢后才退出。
如果為 true,則等待直到I2C總線操作完成或者超時才返回
如果為 false,則檢查結果后立刻返回。調用者必須保證
操作的緩沖區保持有效(例如StartWrite 函數的buf 所指向的內容),
否則會產生意外結果。 返回:
返回錯誤代碼。正常為 IE_OK,如果正在等待則返回 IE_IN_PROGRESS
說明:
如果執行過程中遇到錯誤,則先發送停止條件。
------------------------------------------------------------*/
virtual TI2CErrorCode GetResult(uint32 time_out_in_ms = 20, bool block=true) = 0;
//總線初始化,如果發生錯誤可以再次初始化
//注意:I2C的引腳功能初始化必須有用戶完成
virtual bool Init() = 0;
};
class CAbsI2CBus *GetI2CBus();
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -