蓝牙BLE芯片PHY6222之I2C主从通信
藍(lán)牙BLE芯片PHY6222之I2C主從通信
- 開發(fā)環(huán)境
- I2C主機(jī)
- I2C從機(jī)
- 注意事項(xiàng)
開發(fā)環(huán)境
1.PHY6222開發(fā)板
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主機(jī)
//初始化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的頻率,主機(jī)地址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秒向從機(jī)發(fā)送一次數(shù)據(jù)osal_start_reload_timer(key_TaskID, KEY_I2C_READ_DATA_EVT, 3000);--------------------------------------------------------------------------------------- //事件處理函數(shù),從機(jī)地址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從機(jī)
//從機(jī)初始化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;//從機(jī)中斷源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); } //從機(jī)中斷處理 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的時(shí)候地址會(huì)自動(dòng)左移,意思是:比如sensor的地址是0x89,那此時(shí)讀寫數(shù)據(jù)傳入的地址應(yīng)該是0x44,01000100<<1 等于 10001000,最后一位是讀寫位;
注意事項(xiàng)
1.建議主從機(jī)要共地,且芯片外部SDA和CLK必須上拉電阻(提高驅(qū)動(dòng)能力,我上拉的是4.7K電阻)
2.在jump_table.c里的?jump_table_base函數(shù)里加上I2C的中斷申請(qǐng)
3.PHY6222作為主機(jī)讀寫sensor時(shí)(如SC7A20),不能單單從波形分析,注意sensor手冊(cè)里規(guī)定相應(yīng)的地址,同時(shí)是否與原理圖相對(duì)應(yīng)
4. CFG_SLEEP_MODE=PWR_MODE_NO_SLEEP?不然初始化完就進(jìn)入睡眠了
5. 建議項(xiàng)目工程不能通信的時(shí),可以拿此例程測(cè)試看對(duì)比是否是硬件,或者軟件的主從某一方有問題
PS:個(gè)人學(xué)習(xí)筆記,僅供參考)
實(shí)現(xiàn)效果如下:
總結(jié)
以上是生活随笔為你收集整理的蓝牙BLE芯片PHY6222之I2C主从通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 需求分析挑战之旅(疯狂的订餐系统)(2)
- 下一篇: 2022/10/07