<dl id="b4zrn"><label id="b4zrn"></label></dl><thead id="b4zrn"></thead>

    <blockquote id="b4zrn"></blockquote>

      <strike id="b4zrn"></strike>
        1. <div id="b4zrn"><label id="b4zrn"></label></div>
          您好,歡迎訪問(wèn)上海意泓電子科技有限責(zé)任公司網(wǎng)站!
          4新聞資訊
          您的位置: 首頁(yè) ->  新聞資訊 -> 單片機(jī)

          ?STM8S 模擬I2C程序

          文章出處:?jiǎn)纹瑱C(jī) 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時(shí)間:
          2018
          05-20

          STM8S的硬件I2C還是存在問(wèn)題,不敢貿(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 m.frontgate.com.cn All rights reserved   滬ICP備2021005866號(hào)

          久艹视频在线观看这里只有精品,国语自产拍在线视频普通话94,久久婷婷综合缴情亚洲狠狠,亚洲不卡永远在线精品无码
          <dl id="b4zrn"><label id="b4zrn"></label></dl><thead id="b4zrn"></thead>

            <blockquote id="b4zrn"></blockquote>

              <strike id="b4zrn"></strike>
                1. <div id="b4zrn"><label id="b4zrn"></label></div>