精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

如何在QCC300x上實現(xiàn)I2C功能

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

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

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

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

將數(shù)據(jù)0x1234寫入到芯片寄存器0x06和0x07中:

從寄存器0x06和0x07中讀取:

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

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

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

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

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

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

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

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

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

#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:

/*將數(shù)據(jù)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中,做過嵌入式開發(fā)的人,幾分鐘內(nèi)就能完全讀懂了。跟I2C相關(guān)的其實就一個函數(shù):

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

關(guān)于它的解釋,可以參考API的說明。

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

1.寫:

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

以上函數(shù)會往device_address的設(shè)備將i2c_data數(shù)組中的3個字節(jié)寫入到iic外設(shè)中,i2c_data[0]為device_register,然后后面兩個字節(jié)為數(shù)據(jù)內(nèi)容:

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位置讀取兩個字節(jié)的標準操作。

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

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

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

    關(guān)注

    31

    文章

    5317

    瀏覽量

    120001
  • IIC
    IIC
    +關(guān)注

    關(guān)注

    11

    文章

    300

    瀏覽量

    38273
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1481

    瀏覽量

    123278

原文標題:【BAQ026A】QCC300x如何實現(xiàn)I2C通信

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

收藏 人收藏

    評論

    相關(guān)推薦

    MM32F013x實現(xiàn)I2C多地址的功能應用

    I2C中,通信是借助設(shè)備地址尋址實現(xiàn)的,大致可以分為兩類:一對多、多對多通信。在多主機通信時,從機如果想接收多個主機的數(shù)據(jù),就需要使用到從機多地址的功能。 本文是針對在MM32F013x
    發(fā)表于 01-05 11:43 ?2079次閱讀

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

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

    用Verilog HDL實現(xiàn)I2C總線功能

    簡述了I2C總線的特點;介紹了開發(fā)FPGA時I2C總線模塊的設(shè)計思想;給出并解釋了用Verilog HDL實現(xiàn)部分I2C總線功能的程序,以及
    發(fā)表于 10-19 10:49 ?104次下載

    用Verilog HDL實現(xiàn)I2C總線功能

    摘要: 簡述了I2C總線的特點;介紹了開發(fā)FPGA時I2C總線模塊的設(shè)計思想;給出并解釋了用Verilog HDL實現(xiàn)部分I2C總線功能的程
    發(fā)表于 06-20 13:17 ?6874次閱讀
    用Verilog HDL<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>I2C</b>總線<b class='flag-5'>功能</b>

    NIOS實現(xiàn)I2C總線

    I2C 總線的實現(xiàn)關(guān)鍵是SDA,他是雙向線,如果對與一個芯片只寫而不讀,I2C 實現(xiàn)起來很容易.使用NIOS 實現(xiàn)
    發(fā)表于 11-01 14:28 ?37次下載

    啟動belasigna 300使用I2C接口的方法

    啟動belasigna 300使用I2C接口 簡介 本應用筆記介紹了如何引導belasigna 300通過I2C接口時,它不有一個EEPROM連接(即引導)。這當藍牙或基帶芯片出現(xiàn)情況
    發(fā)表于 03-31 10:38 ?27次下載

    什么是I2C通信協(xié)議?

    在本教程中,我們將學習如何在Raspberry Pi Pico中使用I2C引腳并遍歷I2C掃描器代碼。
    的頭像 發(fā)表于 04-26 15:08 ?7730次閱讀
    什么是<b class='flag-5'>I2C</b>通信協(xié)議?

    硬件I2C與模擬I2C

    硬件I2C對應芯片I2C外設(shè),有相應I2C驅(qū)動電路,其所使用的I2C管腳也是專用的,因而效率要遠高于軟件模擬的
    發(fā)表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與模擬<b class='flag-5'>I2C</b>

    I2C拉電阻設(shè)計

    I2C拉電阻 在一些PCB的layout中,大家往往會看到在I2C通信的接口處,往往會接入一個4.7K的電阻,有的datasheet上面明確有要求,需要接入,有的則沒有要求。 I2C
    發(fā)表于 01-14 14:10 ?9次下載
    <b class='flag-5'>I2C</b><b class='flag-5'>上</b>拉電阻設(shè)計

    何在arduino中使用I2c LCD模塊

    電子發(fā)燒友網(wǎng)站提供《如何在arduino中使用I2c LCD模塊.zip》資料免費下載
    發(fā)表于 10-26 14:29 ?1次下載
    如<b class='flag-5'>何在</b>arduino中使用<b class='flag-5'>I2c</b> LCD模塊

    使用 I2C 接口引導加載 BelaSigna? ??300

    使用 I2C 接口引導加載 BelaSigna? ??300
    發(fā)表于 11-15 20:21 ?3次下載
    使用 <b class='flag-5'>I2C</b> 接口引導加載 BelaSigna? ??<b class='flag-5'>300</b>

    I2C掃描儀之如何在Arduino查找I2C地址

    電子發(fā)燒友網(wǎng)站提供《I2C掃描儀之如何在Arduino查找I2C地址.zip》資料免費下載
    發(fā)表于 01-31 10:19 ?2次下載
    <b class='flag-5'>I2C</b>掃描儀之如<b class='flag-5'>何在</b>Arduino<b class='flag-5'>上</b>查找<b class='flag-5'>I2C</b>地址

    何在Arduino中使用20x4 I2C字符LCD顯示器

    電子發(fā)燒友網(wǎng)站提供《如何在Arduino中使用20x4 I2C字符LCD顯示器.zip》資料免費下載
    發(fā)表于 06-28 15:57 ?0次下載
    如<b class='flag-5'>何在</b>Arduino中使用20<b class='flag-5'>x</b>4 <b class='flag-5'>I2C</b>字符LCD顯示器

    何在I2C 128X32 OLED顯示器滾動文本

    電子發(fā)燒友網(wǎng)站提供《如何在I2C 128X32 OLED顯示器滾動文本.zip》資料免費下載
    發(fā)表于 06-28 15:59 ?0次下載
    如<b class='flag-5'>何在</b><b class='flag-5'>I2C</b> 128<b class='flag-5'>X</b>32 OLED顯示器<b class='flag-5'>上</b>滾動文本

    何在顯示器設(shè)計中使用TPS6598x I2C控制TUSB564

    電子發(fā)燒友網(wǎng)站提供《如何在顯示器設(shè)計中使用TPS6598x I2C控制TUSB564.pdf》資料免費下載
    發(fā)表于 09-12 09:54 ?0次下載
    如<b class='flag-5'>何在</b>顯示器設(shè)計中使用TPS6598<b class='flag-5'>x</b> <b class='flag-5'>I2C</b>控制TUSB564