<wbr id="9qp22"><legend id="9qp22"><rt id="9qp22"></rt></legend></wbr>
<th id="9qp22"><noframes id="9qp22"><form id="9qp22"></form></noframes></th>

      <dd id="9qp22"><big id="9qp22"><video id="9qp22"></video></big></dd>
      <th id="9qp22"></th>
        <rp id="9qp22"><acronym id="9qp22"></acronym></rp>
        <dd id="9qp22"><pre id="9qp22"></pre></dd>

        1. <dd id="9qp22"><pre id="9qp22"></pre></dd>
          1. 打印

            [其他] 【HC32L136 demo板】+硬件I2C讀寫24C04

            [復制鏈接]
            186|3
            跳轉到指定樓層
            樓主
            今晚搞好了硬件I2C讀寫24C04,開發環境KEIL。用例程,程序一點沒改,立馬OK!

            代碼:
            #include "i2c.h"
            #include "gpio.h"
            /******************************************************************************
            * Local pre-processor symbols/macros ('#define')
            ******************************************************************************/

            /******************************************************************************
            * Global variable definitions (declared in header file with 'extern')
            ******************************************************************************/

            /******************************************************************************
            * Local type definitions ('typedef')
            ******************************************************************************/

            /******************************************************************************
            * Local function prototypes ('static')
            ******************************************************************************/

            /******************************************************************************
            * Local variable definitions ('static')                                      *
            ******************************************************************************/

            /******************************************************************************
            * Local pre-processor symbols/macros ('#define')
            ******************************************************************************/
            /*****************************************************************************
            * Function implementation - global ('extern') and local ('static')
            ******************************************************************************/
            /**
            ******************************************************************************
            ** \brief  Main function of project
            **
            ** \return uint32_t return value, if needed
            **
            ** This sample
            **
            ******************************************************************************/
            #define I2C_SLAVEADDR 0xA0
            #define READLEN   10
            uint8_t u8Senddata[10] = {0x12,0x34,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x99};
            uint8_t u8Recdata[10]={0x00};
            uint8_t u8SendLen=0;
            uint8_t u8RecvLen=0;
            uint8_t Send** = 0,Comm_** = 0;
            uint8_t u8recv**=0;
            uint8_t u8State = 0;
            //主發送函數
            en_result_t I2C_MasterWriteData(en_i2c_channel_t enCh,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len);
            //主接收函數
            en_result_t I2C_MasterReadData(en_i2c_channel_t enCh,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len);
            /**
            ******************************************************************************
            ** \brief  主機接收函數
            **
            ** \param u8Addr從機內存地址,pu8Data讀數據存放緩存,u32Len讀數據長度
            **
            ** \retval 讀數據是否成功
            **
            ******************************************************************************/
            en_result_t I2C_MasterReadData(en_i2c_channel_t enCh,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
            {
                en_result_t enRet = Error;
                uint8_t u8i=0,u8State;

                I2C_SetFunc(enCh,I2cStart_En);

                    while(1)
                    {
                            while(0 == I2C_GetIrq(enCh))
                    {}
                            u8State = I2C_GetState(enCh);
                            switch(u8State)
                            {
                                    case 0x08:
                                            I2C_ClearFunc(enCh,I2cStart_En);
                                            I2C_WriteByte(enCh,I2C_SLAVEADDR);
                                            break;
                                    case 0x18:
                                            I2C_WriteByte(enCh,u8Addr);
                                            break;
                                    case 0x28:
                                            I2C_SetFunc(enCh,I2cStart_En);
                                            break;
                                    case 0x10:
                                            I2C_ClearFunc(enCh,I2cStart_En);
                                            I2C_WriteByte(enCh,I2C_SLAVEADDR|0x01);//從機地址發送OK
                                            break;
                                    case 0x40:
                                            if(u32Len>1)
                                            {
                                                    I2C_SetFunc(enCh,I2cAck_En);
                                            }
                                            break;
                                    case 0x50:
                                            pu8Data[u8i++] = I2C_ReadByte(enCh);
                                            if(u8i==u32Len-1)
                                            {
                                                    I2C_ClearFunc(enCh,I2cAck_En);
                                            }
                                            break;
                                    case 0x58:
                                            pu8Data[u8i++] = I2C_ReadByte(enCh);
                                            I2C_SetFunc(enCh,I2cStop_En);
                                            break;       
                                    case 0x38:
                                            I2C_SetFunc(enCh,I2cStart_En);
                                            break;
                                    case 0x48:
                                            I2C_SetFunc(enCh,I2cStop_En);
                                            I2C_SetFunc(enCh,I2cStart_En);
                                            break;
                                    default:
                                            I2C_SetFunc(enCh,I2cStart_En);//其他錯誤狀態,重新發送起始條件
                                            break;
                            }
                            I2C_ClearIrq(enCh);
                            if(u8i==u32Len)
                            {
                                    break;
                            }
                    }
                    enRet = Ok;
                    return enRet;
            }
            /**
            ******************************************************************************
            ** \brief  主機發送函數
            **
            ** \param u8Addr從機內存地址,pu8Data寫數據,u32Len寫數據長度
            **
            ** \retval 寫數據是否成功
            **
            ******************************************************************************/
            en_result_t I2C_MasterWriteData(en_i2c_channel_t enCh,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
            {
                en_result_t enRet = Error;
                uint8_t u8i=0,u8State;
                I2C_SetFunc(enCh,I2cStart_En);
                    while(1)
                    {
                            while(0 == I2C_GetIrq(enCh))
                            {;}
                            u8State = I2C_GetState(enCh);
                            switch(u8State)
                            {
                                    case 0x08:
                                            I2C_ClearFunc(enCh,I2cStart_En);
                                            I2C_WriteByte(enCh,I2C_SLAVEADDR);//從設備地址發送
                                            break;
                                    case 0x18:
                                            I2C_WriteByte(enCh,u8Addr);//從設備內存地址發送
                                            break;
                                    case 0x28:       
                                            I2C_WriteByte(enCh,pu8Data[u8i++]);
                                            break;
                                    case 0x20:
                                    case 0x38:
                                            I2C_SetFunc(enCh,I2cStart_En);
                                            break;
                                    case 0x30:
                                            I2C_SetFunc(enCh,I2cStop_En);
                                            break;
                                    default:
                                            break;
                            }                       
                            if(u8i>u32Len)
                            {
                                    I2C_SetFunc(enCh,I2cStop_En);//此順序不能調換,出停止條件
                                    I2C_ClearIrq(enCh);
                                    break;
                            }
                            I2C_ClearIrq(enCh);                       
                    }
                enRet = Ok;
                return enRet;
            }
            int32_t main(void)
            {
                stc_gpio_config_t stcGpioCfg;
                stc_i2c_config_t stcI2cCfg;
                stc_sysctrl_clk_config_t stcCfg;
                DDL_ZERO_STRUCT(stcCfg);
                DDL_ZERO_STRUCT(stcI2cCfg);
                DDL_ZERO_STRUCT(stcGpioCfg);

                Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
                Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c1,TRUE);

                stcGpioCfg.enDir = GpioDirOut;
                stcGpioCfg.enOD = GpioOdEnable;
                stcGpioCfg.enPuPd = GpioPu;

                Gpio_Init(GpioPortA, GpioPin11,&stcGpioCfg);
                Gpio_Init(GpioPortA, GpioPin12,&stcGpioCfg);

                Gpio_SetAfMode(GpioPortA, GpioPin11,GpioAf3);//SCL
                Gpio_SetAfMode(GpioPortA, GpioPin12,GpioAf3);//SDA

                stcI2cCfg.enFunc = I2cBaud_En;
                stcI2cCfg.u8Tm = 0x04;//100K=(4000000/(8*(4+1))
                stcI2cCfg.pfnI2c1Cb = NULL;
                stcI2cCfg.bTouchNvic = FALSE;
                    if(TRUE == stcI2cCfg.bTouchNvic)
                    {
                            EnableNvic(I2C1_IRQn,IrqLevel3,TRUE);
                    }
                I2C_DeInit(I2C1);
                I2C_Init(I2C1,&stcI2cCfg);//初始化模塊
                I2C_SetFunc(I2C1,I2cMode_En);//模塊使能
                I2C_SetFunc(I2C1,I2cStart_En);//開始信號
                    I2C_MasterWriteData(I2C1,0x00,u8Senddata,10);
                    delay1ms(100);
                    I2C_MasterReadData(I2C1,0x00,u8Recdata,10);
                while(1)
                {
                }  
            }

            效果圖:



            沒想到模擬時序不行,明天搞出來。

            使用特權

            評論回復
            沙發
            | 2019-9-27 22:16 | 只看該作者
            這是常規I2C使用方式,我們的驅動庫里面有這個讀寫24系列的驅動庫

            使用特權

            評論回復
            板凳
             樓主 | 2019-9-28 07:50 | 只看該作者
            liaotian001 發表于 2019-9-27 22:16
            這是常規I2C使用方式,我們的驅動庫里面有這個讀寫24系列的驅動庫

            我用的就是那個

            使用特權

            評論回復
            地板
            | 2019-9-29 11:09 | 只看該作者
            小哥哥給力

            使用特權

            評論回復
            掃描二維碼,隨時隨地手機跟帖
            您需要登錄后才可以回帖 登錄 | 注冊

            本版積分規則

            我要發帖 投訴建議 創建版塊 申請版主

            快速回復

            您需要登錄后才可以回帖
            登錄 | 注冊
            高級模式

            論壇熱帖

            在線客服 快速回復 返回頂部 返回列表
            成人短片线上看