日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝牙BLE芯片PHY6222之I2C主从通信

發布時間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝牙BLE芯片PHY6222之I2C主从通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

藍牙BLE芯片PHY6222之I2C主從通信

  • 開發環境
  • I2C主機
  • I2C從機
  • 注意事項

開發環境

1.PHY6222開發板
2.SDK版本以及路徑:SDK\release_bbb_sdk-PHY62XX_SDK_3.0.9\example\peripheral\gpio
3.硬件連接
SDA??GPIO_P33----------GPIO_33
CLK??GPIO_P34----------GPIO_34
?????GND----------GND

I2C主機

//初始化hal_gpio_pin_init(I2C_MASTER_SDA,IE);hal_gpio_pin_init(I2C_MASTER_CLK,IE);hal_gpio_pull_set(I2C_MASTER_SDA,STRONG_PULL_UP);hal_gpio_pull_set(I2C_MASTER_CLK,STRONG_PULL_UP);hal_i2c_pin_init(I2C_0, I2C_MASTER_SDA, I2C_MASTER_CLK);//使用I2C0,100K的頻率,主機地址0x10master_pi2c=hal_i2c_init(I2C_0,I2C_CLOCK_100K);//I2C_CLOCK_400K);if(master_pi2c==NULL){LOG("I2C master init fail\n");}else{LOG("I2C master init OK\n");} //每3秒向從機發送一次數據osal_start_reload_timer(key_TaskID, KEY_I2C_READ_DATA_EVT, 3000);--------------------------------------------------------------------------------------- //事件處理函數,從機地址slave_i2c_addr為0x20if( events & KEY_I2C_READ_DATA_EVT){int res;static int i=0;i++;LOG("i==%d\n",i);res=I2CWrite(master_pi2c,I2C_TX_data,I2C_MASTER_SEND_DATA_LEN,slave_i2c_addr);if(res==PPlus_SUCCESS)LOG("I2C Master send data ok\n");return (events ^ KEY_I2C_READ_DATA_EVT);}

I2C從機

//從機初始化hal_gpio_pin_init(I2C_SLAVE_SDA,IE);hal_gpio_pin_init(I2C_SLAVE_CLK,IE);hal_gpio_pull_set(I2C_SLAVE_SDA,STRONG_PULL_UP);hal_gpio_pull_set(I2C_SLAVE_CLK,STRONG_PULL_UP);I2C_Slave_Init(); {I2C_Slave_Parameter *I2C_Slave_cfg = (I2C_Slave_Parameter *)osal_mem_alloc(sizeof(I2C_Slave_Parameter));osal_memset(I2C_Slave_cfg,0,sizeof(I2C_Slave_Parameter));// config i2c slave parameterI2C_Slave_cfg->id = I2C_Slave_Module;I2C_Slave_cfg->workmode = Slave;I2C_Slave_cfg->AddressMode = I2C_ADDR_7bit;//從機中斷源I2C_Slave_cfg->IRQ_Source = (I2C_MASK_TX_ABRT | I2C_MASK_RD_REQ | I2C_MASK_RX_FULL | I2C_MASK_RX_DONE |I2C_MASK_RX_UNDER);//| I2C_TX_EMPTY_Evt);I2C_Slave_cfg->RX_FIFO_Len = I2C_RX_TL_CNT;I2C_Slave_cfg->Tx_FIFO_Len = I2C_TX_TL_CNT;I2C_Slave_cfg->Slave_Address =0x20;//0x20;// chendy add 20200909 I2C_IC_DEFAULT_ADDR;I2C_Slave_cfg->SCL_PIN = I2C_SLAVE_CLK;I2C_Slave_cfg->SDA_PIN = I2C_SLAVE_SDA;I2C_Slave_cfg->evt_handler = hal_i2c_slave_evt_hdl;ret = Hal_I2C_Slave_Init(I2C_Slave_cfg,&I2C_Slave_Handle);if( ret != PPlus_IIC_SUCCESS ){I2C_Slave_Handle = PPlus_INVALID_HANDLE;LOG("I2C Slave Init Failure %d \n",ret);}else{LOG("I2C Slave Init Success111 , handle:%d \n",I2C_Slave_Handle);}osal_mem_free(I2C_Slave_cfg); } //從機中斷處理 void hal_i2c_slave_evt_hdl(I2C_Evt_t *pev) {uint16_t conn_hdl;LOG("i2c s handle type=%x,len=%x\n",pev->type,pev->len);switch(pev->type){case I2C_RX_UNDER_Evt://IC_RXFLRbreak;case I2C_RX_OVER_Evt:break;case I2C_RX_FULL_Evt://I2C_slave_rx_handle(I2C_RX_TL_CNT);hal_i2c_slave_rx_full_handler();osal_set_event(key_TaskID,KEY_I2C_READ_DATA_EVT);break; .........

特別需要注意的是:PHY6222的硬件I2C在讀寫sensor的時候地址會自動左移,意思是:比如sensor的地址是0x89,那此時讀寫數據傳入的地址應該是0x44,01000100<<1 等于 10001000,最后一位是讀寫位;

注意事項

1.建議主從機要共地,且芯片外部SDA和CLK必須上拉電阻(提高驅動能力,我上拉的是4.7K電阻)
2.在jump_table.c里的?jump_table_base函數里加上I2C的中斷申請
3.PHY6222作為主機讀寫sensor時(如SC7A20),不能單單從波形分析,注意sensor手冊里規定相應的地址,同時是否與原理圖相對應
4. CFG_SLEEP_MODE=PWR_MODE_NO_SLEEP?不然初始化完就進入睡眠了
5. 建議項目工程不能通信的時,可以拿此例程測試看對比是否是硬件,或者軟件的主從某一方有問題

PS:個人學習筆記,僅供參考)
實現效果如下:

總結

以上是生活随笔為你收集整理的蓝牙BLE芯片PHY6222之I2C主从通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。