<dl id="xausj"></dl>
    1. <ul id="xausj"><th id="xausj"></th></ul>

      <b id="xausj"></b>
      <cite id="xausj"></cite>
      <b id="xausj"><meter id="xausj"></meter></b>
      <dl id="xausj"><noframes id="xausj"></noframes></dl>
    2. 您好,歡迎訪問上海意泓電子科技有限責(zé)任公司網(wǎng)站!
      4新聞資訊
      您的位置: 首頁 ->  新聞資訊 -> 單片機(jī)

      ?STM8S 模擬I2C程序

      文章出處:?jiǎn)纹瑱C(jī) 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時(shí)間:
      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 : 大約延時(shí)5us
      //--------------------------------------------------------------
      void Delay_5us(void)
      {
      uchar i; //fcpu 8MHz 時(shí)
      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.pendragonrpg.com All rights reserved   滬ICP備2021005866號(hào)

      国产中文欧美日韩,色播在线永久免费视频,另类专区亚洲无码,亚洲中文字无码av

      <dl id="xausj"></dl>
      1. <ul id="xausj"><th id="xausj"></th></ul>

        <b id="xausj"></b>
        <cite id="xausj"></cite>
        <b id="xausj"><meter id="xausj"></meter></b>
        <dl id="xausj"><noframes id="xausj"></noframes></dl>