<strong id="lmxpx"></strong>
  • <small id="lmxpx"><span id="lmxpx"><p id="lmxpx"></p></span></small>
    <rp id="lmxpx"></rp>
    <progress id="lmxpx"><track id="lmxpx"></track></progress>

    1. <ol id="lmxpx"></ol>
      <rp id="lmxpx"><ruby id="lmxpx"></ruby></rp>
    2. <button id="lmxpx"><acronym id="lmxpx"></acronym></button>
    3. 打印

      [其他] 【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 | 只看該作者
      小哥哥給力

      使用特權

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

      本版積分規則

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

      快速回復

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

      論壇熱帖

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