蓝牙BLE芯片PHY6222之I2C主从通信
生活随笔
收集整理的這篇文章主要介紹了
蓝牙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主从通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 需求分析挑战之旅(疯狂的订餐系统)(2)
- 下一篇: 2022/10/07