<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在QCC300x上實現I2C功能

藍牙 ? 來源:藍牙 ? 作者:藍牙 ? 2020-10-10 09:28 ? 次閱讀

本文主要介紹如何在QCC300x上實現I2C功能,只在空白工程上實現相關功能。所用的ADK版本為ADK_QCC300x.WIN.1.0.167。

此方法理論上同樣適用于CSR8670/CSR8675。

本文實現的功能很簡單,通過對IIC設備發起一個讀寫操作,從設備有ACK即可。因為如果實現了這個基本操作,后續的其他復雜操作就是怎么寫代碼的問題了。

將數據0x1234寫入到芯片寄存器0x06和0x07中:

從寄存器0x06和0x07中讀?。?/p>

這里先講一下硬件,本次測試用的是官方的開發板,在開發板的P00和P01口上掛了一顆IC--TCA9555,它是一顆IO擴展芯片,IIC接口,所以,本次測試正好使用這顆芯片作為測試。

QCC300x的IIC默認配置為P00和P01,當然它也可以改成其他IO:

首先,建立一個空白工程,然后工程屬性中有個地方需要改一下:

改Transport的原因是因為我們使用P00和P01作為I2C的接口,如果使用其他IO口,這個應該就不用改了。

然后,我們先燒錄一下程序,這樣它會擦除FLASH并對FLASH進行分區,然后再用pstool merge一下默認的psr程序(這個請參考之前文檔)。然后用pstool改以下配置:

將I2C configuration改為“1”的目的是將IIC的速率切換到400kHz。

下面兩個參數是配置I2C接口所對應的IO口的:

這些配置完畢后,保存pskey,然后,開始編寫我們的代碼。

代碼也很簡單,就一個main.c文檔,代碼內容如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MESSAGE_TX_DATA 0x4000

#define MESSAGE_RX_DATA 0x4001

#define I2C_DEVICE_ADDRESS (0x20<<1)

#define I2C_A_DEVICE_REGISTER 0x06

typedef struct

{

TaskData task;

}I2CTaskData;

I2CTaskData theI2CTaskData;

uint16 i2c_register_data;

static void I2CMessageHandler(Task pTask, MessageId pId,Message pMessage);

static void i2c_example_init(void);

static void i2c_write_16bit_device_register(uint8device_address, uint8 device_register, uint16 data);

static void i2c_read_16bit_device_register(uint8device_address, uint8 device_register, uint16 *data);

int main(void)

{

PRINT(("hello world. "));

i2c_example_init();

/* Start the message scheduler loop */

MessageLoop();

/* Never get here...*/

return 0;

}

void i2c_example_init(void)

{

/* Assign task message handler */

theI2CTaskData.task.handler = I2CMessageHandler;

/* Send MESSAGE_TX_DATA to the task */

MessageSendLater(&theI2CTaskData.task,MESSAGE_TX_DATA, 0, 2000);

/* Send MESSAGE_RX_DATA to the task */

MessageSendLater(&theI2CTaskData.task,MESSAGE_RX_DATA, 0, 1000);

}

void i2c_write_16bit_device_register(uint8device_address, uint8 device_register, uint16 data)

{

uint8 i2c_data[3];

i2c_data[0] = device_register;

i2c_data[1] = (data >> 8) & 0xFF;

i2c_data[2] = data & 0xFF;

/*

I2cTransfer(uint16 address, const uint8 *tx, uint16tx_len, uint8 *rx, uint16 rx_len)

If tx_len is non-zero and rx_len is zero then the sequencereduces to:

- Start condition (S).

- Write slave address and direction byte (address | 0).

- Write tx_len data bytes from the buffer at tx.

- Stop condition (P).

*/

/*I2cTransfer(device_address, i2c_data, 3, NULL, 0);*/

PanicZero(I2cTransfer(device_address, i2c_data, 3, NULL,0));

}

void i2c_read_16bit_device_register(uint8 device_address,uint8 device_register, uint16 *data)

{

uint8 i2c_data[1];

uint8 i2c_rx_data[2];

i2c_data[0] = device_register;

/*

I2cTransfer(uint16 address, const uint8 *tx, uint16tx_len, uint8 *rx, uint16 rx_len)

If tx_len is non-zero and rx_len is non-zero then thesequence is:

- Start condition (S).

- Write slave address and direction byte (address | 0).

- Write tx_len data bytes from the buffer at tx.

- Repeated start condition (Sr).

- Write slave address and direction byte (address | 1).

- Read rx_len bytes into the buffer at rx, acknowledgingall but the final byte.

- Stop condition (P).

*/

/*I2cTransfer(device_address, i2c_data, 1, i2c_rx_data,2);*/

PanicZero(I2cTransfer(device_address, i2c_data, 1,i2c_rx_data, 2));

*data = (i2c_rx_data[0] << 8) + i2c_rx_data[1];

}

void I2CMessageHandler(Task pTask, MessageId pId, MessagepMessage)

{

switch (pId)

{

case MESSAGE_TX_DATA:

/*將數據0x1234寫入到寄存器0x06和0x07中*/

i2c_write_16bit_device_register(I2C_DEVICE_ADDRESS,I2C_A_DEVICE_REGISTER,0x1234);

/* Send MESSAGE_TX_DATA to the task */

MessageSendLater(&theI2CTaskData.task,MESSAGE_TX_DATA, 0, 1000);

break;

case MESSAGE_RX_DATA:

/*從寄存器0x06和0x07中讀取之前寫入的值*/

i2c_read_16bit_device_register(I2C_DEVICE_ADDRESS,I2C_A_DEVICE_REGISTER,&i2c_register_data);

/* Send MESSAGE_RX_DATA to the task */

MessageSendLater(&theI2CTaskData.task,MESSAGE_RX_DATA, 0, 2000);

break;

default:

break;

}

}

也沒啥好講的,直接貼到main.c中,做過嵌入式開發的人,幾分鐘內就能完全讀懂了。跟I2C相關的其實就一個函數:

uint16 I2cTransfer(uint16 address, constuint8 *tx, uint16 tx_len, uint8 *rx, uint16 rx_len);

關于它的解釋,可以參考API的說明。

這里再簡單講一下如何用I2cTransfer實現IIC的最基本的兩個操作吧。

1.寫:

I2cTransfer(device_address, i2c_data, 3, NULL, 0);

以上函數會往device_address的設備將i2c_data數組中的3個字節寫入到iic外設中,i2c_data[0]為device_register,然后后面兩個字節為數據內容:

i2c_data[0]= device_register;

i2c_data[1]= (data >> 8) & 0xFF;

i2c_data[2] = data & 0xFF;

2.讀:

i2c_data[0]= device_register;

I2cTransfer(device_address,i2c_data, 1, i2c_rx_data, 2);

*data = (i2c_rx_data[0] << 8) + i2c_rx_data[1];

以上代碼是從device_register位置讀取兩個字節的標準操作。

更多操作的話,可以參考前面提到的API說明。

最后,編譯運行,就能得到文章一開始的結果了。
責任編輯:YYX

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    30

    文章

    5042

    瀏覽量

    117808
  • IIC
    IIC
    +關注

    關注

    11

    文章

    287

    瀏覽量

    37828
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1348

    瀏覽量

    120904

原文標題:【BAQ026A】QCC300x如何實現I2C通信

文章出處:【微信號:TalkBT,微信公眾號:藍牙】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用Beaglebone的I2C

    I2C2_SCL),使能上下拉,開啟拉(所以我們可以不必外接上拉電阻了),使能輸入,高速模式。同樣可以檢查94號引腳,也是0x00000073。3、查找i2c設備的地址(此時我們還沒
    發表于 10-22 13:52

    I2C

    ??????????????? Boot from i2c EEPROM at I2c bus address 0x
    發表于 06-24 01:28

    在MCP23X17評估板使用MCP23017,具有I2C板外功能

    嗨,我最近買了MCP23 x17評估板,用我的樹莓PI模型B+V1.2測試I2C接口。首先,我檢查了評估板是操作性的:沒有問題(在TP2提供5V,TP1
    發表于 09-04 15:44

    I2C代碼是如何在和聲框架中實現

    嗨,我想了解I2C代碼是如何在和聲框架中實現的。我使用的是IASCII中斷代碼作為BASYS。我嘗試使用PIC32 MX975 F512H作為主機,并將I2C總線轉換成USB通過CH3
    發表于 03-07 12:21

    何在I2C從外部微控制器運行引導加載程序?

    編程部分。我還沒有找到任何關于如何使用外部微控制器作為引導加載程序的文檔。我只能在HSSP編程接口上找到文檔,如果它壞了,可能會擦除引導加載程序。有人知道是否有一個文檔顯示如何在I2C從外部微控制器
    發表于 07-12 09:09

    到底什么是I2C

    搜索將會告訴您,I2C使系統設計人員能夠輕松實現魯棒的系統控制。這一協議不僅有用,而且還具有很多設備功能,可令您的系統受益。您可以使用緩沖中繼器、I / O擴展器和
    發表于 07-23 04:45

    高通QCC300x系列藍牙芯片應用常見問題的解達

    程序下載燒錄,成功跑起來了。經過三周學習及調式,最終完成了客戶demo的功能,交樣機給客戶去評估?,F我遇見的部分問題及商家提供的解決 分享給大家,可以少走彎路。問:QCC300x可以做發射功能嗎?類似于
    發表于 02-15 19:29

    gpio引腳復用i2c功能

    omapl138開發板中i2c接口被占完,將i2c接口的電源模塊連接到未使用的dsp引腳上了,現在需要讀取電源模塊的信息, 怎么實現這個功能,求指導下。是使用gpio引腳復用
    發表于 07-29 17:32

    HarmonyOS 驅動平臺---I2C

    展示I2C接口的完整使用流程。本例擬對Hi3516DV300某開發板TouchPad設備進行簡單的寄存器讀寫訪問,基本硬件信息如下:SOC:hi3516dv300Touch IC:
    發表于 09-16 18:54

    I2C不迷茫--系列文章講透I2C

    用于確定拉電阻器尺寸并確定電路走線最大長度的數學計算。讓我們從討論2 C實際是什么開始。5、如何在示波器
    發表于 09-22 09:31

    什么是軟件I2C和硬件I2C

    23章“I2C–讀寫EEPROM”原理章節)2)閱讀AHT20數據手冊,編程實現:每隔2秒鐘采集一次溫濕度數據,并通過串口發送到上位機(win10)。...
    發表于 08-23 06:19

    何在MM32SPIN27實現硬件I2C從機呢

    翻遍了網絡,國產MCU的資源還是較少,就貢獻一個吧使用了國產的RT-thread操作系統+M0的單片機,在靈動微MM32SPIN27實現的硬件I2C從機,有需要的朋友拿去,根據情況改改可用1.
    發表于 02-11 06:55

    何在內置電容式觸摸面板FT5336測試I2C驅動功能呢?

    驅動程序,我決定最好在內置電容式觸摸面板 FT5336 測試我的 I2C 技能。我使用 ST 提供的 ft5336.c/.h 來獲取寄存器地址(因為 FT5336 數據表實際沒有
    發表于 12-09 07:21

    何在PSOC和ST之間實現I2C通信?

    我想在 PSOC 和 ST 之間實現 I2C 通信。我已將 PSoc 配置為 I2C Master,將 ST 配置為 I2C Slave。我已成功將數據從 PSoc 傳輸到 ST,但無
    發表于 01-17 06:06

    何在esp8266啟用多個i2c總線?

    所以,正如我所發現的,esp8266 i2c 解決方案是純粹的軟件,那么我應該如何在 esp8266 啟用多個 i2c 總線?我像 arduino 一樣嘗試了這個,因為可以啟用:代碼
    發表于 02-24 07:02
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>