<tfoot id="ygvxt"><menuitem id="ygvxt"></menuitem></tfoot>
    • <kbd id="ygvxt"></kbd>
      <th id="ygvxt"><progress id="ygvxt"></progress></th>

      您好,歡迎訪問上海意泓電子科技有限責(zé)任公司網(wǎng)站!
      4新聞資訊
      您的位置: 首頁 ->  新聞資訊 -> 單片機

      ?STM8S 模擬I2C程序

      文章出處:單片機 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時間:
      2018
      05-20

      STM8S的硬件I2C還是存在問題,不敢貿(mào)然使用.

      #define SCL PE_ODR_ODR1
      #define SDA PE_ODR_ODR2
      #define SDAM PE_IDR_IDR2
      #define SET_SCL_OUT() {PE_DDR_DDR1=1; PE_CR1_C11 = 1; PE_CR2_C21 = 0;}
      #define SET_SDA_OUT() {PE_DDR_DDR2=1; PE_CR1_C12 = 1; PE_CR2_C22 = 0;}
      #define SET_SDA_IN() {PE_DDR_DDR2=0; PE_CR1_C12 = 0; PE_CR2_C22 = 0;}
      //--------------------------------------------------------------
      // Prototype : void I2C_Start(void)
      // Calls : Delay_5us()
      // Description : Start Singnal
      //--------------------------------------------------------------
      void I2C_Init(void)
      {
      I2C_CR1 &= 0xFE; // PE=0, disable I2C module 
      SET_SCL_OUT();
      SET_SDA_OUT(); 
      }

      //--------------------------------------------------------------
      // Prototype : void Delay_5us(void)
      // Description : 大約延時5us
      //--------------------------------------------------------------
      void Delay_5us(void)
      {
      uchar i; //fcpu 8MHz 時
      for (i=50; i>0; i--);
      }

      //--------------------------------------------------------------
      // Prototype : void I2C_Start(void)
      // Calls : Delay_5us()
      // Description : Start Singnal
      //--------------------------------------------------------------
      void I2C_Start(void)
      {
      // SDA 1->0 while SCL High
      SDA = 1; 
      SCL = 1; 
      Delay_5us(); 
      SDA = 0; 
      Delay_5us(); 
      SCL = 0; 
      }

      //--------------------------------------------------------------
      // Prototype : void I2C_Stop(void)
      // Calls : Delay_5us()
      // Description : Stop Singnal
      //-------------------------------------------------------------- 
      void I2C_Stop(void)
      {
      // SDA 0->1 while SCL High
      SDA = 0; 
      SCL = 1; 
      Delay_5us(); 
      SDA = 1; 
      Delay_5us(); 
      }
      //--------------------------------------------------------------
      // Prototype : void I2C_SendACK(uchar ack);
      // Calls : Delay_5us()
      // Parameters : bit ack:1-noack, 0-ack
      // Description : Master device send ACK to slave device.
      //--------------------------------------------------------------
      void I2C_SendACK(uchar ack)
      {
      if(ack == 0)
      {
      SDA = 0; 

      else
      {
      SDA = 1; 
      }

      SCL = 1; 
      Delay_5us(); 

      SCL = 0; 
      Delay_5us(); 
      }
      //--------------------------------------------------------------
      // Prototype : uchar I2C_SendByte(uchar sendDAT)
      // Calls : Delay_5us()
      // Parameters : uchar sendDAT---data to be send
      // Return Value : CY--slave ack (1---noack,0---ack)
      // Description : Send one byte to I2C
      //--------------------------------------------------------------
      uchar I2C_SendByte(uchar sendDAT)
      {
      uchar i,revack;
      for (i= 0 ; i< 8; i++) 
      {
      SCL = 0; 
      Delay_5us(); 
      if (sendDAT & 0x80) // write data
      {
      SDA = 1;
      }
      else 
      {
      SDA = 0;
      }
      sendDAT <<= 1;
      SCL = 1; 
      Delay_5us(); 


      SCL = 0; 
      Delay_5us(); 

      SET_SDA_IN();

      SCL = 1; 
      asm("nop");
      asm("nop");

      revack = (uchar)SDAM;

      Delay_5us(); 
      SCL = 0; 

      SET_SDA_OUT();

      Delay_5us(); 
      return revack;
      }

      //--------------------------------------------------------------
      // Prototype : uchar I2C_RecvByte()
      // Calls : Delay_5us()
      // Parameters : none
      // Return Value : revDAT- received data
      // Description : Receive one byte from I2C
      //--------------------------------------------------------------
      uchar I2C_RecvByte()
      {
      uchar i;
      uchar revDAT = 0;

      SDA = 1; // latch the Data port befor reading

      SET_SDA_IN();

      for (i=0; i<8; i++) 

      revDAT <<= 1;

      SCL = 1; 

      asm("nop");
      asm("nop");

      if (SDAM)
      {
      revDAT |= 0x01;
      }
      else
      {
      revDAT &= 0xfe;
      }
      Delay_5us(); 
      SCL = 0; 
      Delay_5us(); 
      }

      SET_SDA_OUT();

      return revDAT;
      }

      //--------------------------------------------------------------
      // Prototype : void Write_PT2314(uchar wdata)
      // Calls : I2C_Start(), I2C_Stop(),I2C_SendByte()
      // Parameters : RegAddr-- target memory address, 
      // wrdata--- data to be writing
      // Description : Write one byte to target memory
      //--------------------------------------------------------------
      void Write_24c02(uchar regadd,uchar wdata)
      {
      I2C_Start(); 
      I2C_SendByte(0xA0); // Device Addr + Write (operation) 
      I2C_SendByte(regadd); 
      I2C_SendByte(wdata); 
      I2C_Stop(); 
      }
      uchar Read_24c02(uchar regadd)
      {
      uchar revdata;

      I2C_Start(); 
      I2C_SendByte(0xA0); // Device Addr + Write (operation) 
      I2C_SendByte(regadd); 

      I2C_Start(); 
      I2C_SendByte(0xA1); // Device Addr + Write (operation) 

      revdata = I2C_RecvByte(); 
      I2C_SendACK(1);

      I2C_Stop(); 

      return revdata;
      }


      上海意泓電子科技有限責(zé)任公司 版權(quán)所有 未經(jīng)授權(quán)禁止復(fù)制或鏡像

      CopyRight 2020-2025 www.hljhgw.com All rights reserved   滬ICP備2021005866號

      国产强伦姧在线观看,…中文天堂在线一区,亚洲欧洲精品污网站在线观看,在线视频综合站
      <tfoot id="ygvxt"><menuitem id="ygvxt"></menuitem></tfoot>
        • <kbd id="ygvxt"></kbd>
          <th id="ygvxt"><progress id="ygvxt"></progress></th>