iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
IoT

玩玩 BLE系列 第 23

[Day 23] TI-RTOS Driver - bsp_i2c

TI-RTOS提供了一些驅動,
這篇要來介紹的是TI-RTOS I2C的驅動的程式碼,
這支程式把暫存器的操作和I2C的基本運作進行了包裝,
最後我們只需要呼叫這幾個函式就可以完成I2C的讀寫,
直接來看bsp_i2c.h就好,bsp_i2c.c 的部分就跳過了

// 這兩個定義的功能我還不清楚
// 從範例程式看來只有用到第一個 BSP_I2C_INTERFACE_0
#define BSP_I2C_INTERFACE_0 0
#define BSP_I2C_INTERFACE_1 1

// 這個函式通常在系統初始化的時候就會先做,
// 這個函式內部除了會初始化I2C的暫存器狀態和參數配置之外,
// 還會建立一個號誌(Semaphore),
// 用來避免多執行緒(Thread)或任務(Task)同時呼叫bsp_i2c的讀寫,
// 所造成的資源衝突。
void bspI2cInit(void);

// 透過I2C 讀取外部裝置的資料並存入指定位址
bool bspI2cRead(uint8_t *pBuf, uint8_t len);
// 透過I2C 把指定位址的資料發送至外部裝置
bool bspI2cWrite(uint8_t *pBuf, uint8_t len);
// 同上,但長度只有一個位元組
bool bspI2cWriteSingle(uint8_t data);
// 先寫出指定長度的資料,再讀取指定長度的資料到指定的位址
// 通常I2C 裝置都要先指定從機位址,
// 所以常直接呼叫這個函式來進行讀取外部I2C 裝置的資料
bool bspI2cWriteRead(uint8_t *wdata, uint8_t wlen, uint8_t *rdata, uint8_t rlen);

// 在進行I2C讀寫前,必須要先呼叫這個函式
// 這個函式包含號誌的控制(Semaphore_pend())
void bspI2cAcquire(uint8_t interface, uint8_t slaveAddress);

// 在結束I2C 的讀寫後,必須呼叫這個函式來釋放號誌(Semaphore_post())
void bspI2cRelease(void);

最後來看一下使用bsp_i2c驅動的範例- sensor_bmp280.c,
這同樣在TI 範例程式中找到的,

void sensorBmp280Init(void)
{
  uint8_t val;
  
  // 1. 帶入從機的位址,並嘗試取得使用I2C 的權限,取得權限後,可避免其他執行緒也進行I2C 的操作而造成當機
  bspI2cAcquire(BSP_I2C_INTERFACE_0,SENSOR_I2C_ADDRESS);

  // 2. 讀取從機上的資料,
  //     第一個參數是該晶片的暫存器位址,(這要看從機晶片的規格書)
  //     第二個參數是存放資料的位址
  //     第三個參數是讀取資料的長度
  // Read and store calibration data
  sensorReadReg( ADDR_CALIB, calData, CALIB_DATA_SIZE);

  // 3. 寫資料到從機上
  //     第一個參數是該晶片的暫存器位址,(這要看從機晶片的規格書)
  //     第二個參數是準備寫出去的資料的位址
  //     第三個參數是讀取資料的長度
  // Reset the sensor
  val = VAL_RESET_EXECUTE;
  sensorWriteReg(ADDR_RESET, &val, sizeof(val));

  // 3. 操作結束後,釋放I2C 的權限
  bspI2cRelease();
}

使用別人包好的驅動就是那麼簡單,
只要幾個步驟即可完成I2C 的讀寫,
今天分享就到這,大家明天見。


上一篇
[Day 22] 晶片間的通訊-I2C
下一篇
[Day 24] 晶片間的通訊-UART
系列文
玩玩 BLE27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言