<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          STM8S105S4 I2C

          作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          STM8S105S4 I2C這樣配置可以從機(jī)發(fā)數(shù)據(jù),從機(jī)接數(shù)據(jù)就不行,是什么問題
          //I2C端口初始化
          GPIO_Init(GPIOE,GPIO_PIN_1|GPIO_PIN_2, GPIO_MODE_OUT_OD_HIZ_SLOW);
          void I2C_init(void)
          {
          I2C_CCRH = 0; //標(biāo)準(zhǔn)I2C接口
          I2C_CCRL = 80 ;
          I2C_FREQR = 16;
          I2C_OARL = (I2CAddr<<1);
          I2C_OARH= 0x40;
          I2C_ITR =0x06;
          I2C_CR1 =0x01;
          I2C_CR2 |=0x04;
          }
          @far @interrupt void I2C_Handler (void)
          {
          u8 state1,state2,state3;
          state1 = I2C_SR1;
          state2 = I2C_SR2;
          state3 = I2C_SR3;
          //地址匹配
          if((state1&0x02)!=0){I2C_CR2 |= 0x04;}
          //接收到數(shù)據(jù),需要處理
          if( (state1& 0x40) != 0)
          {
          I2C_CR2|= 0x04;
          temp1= I2C_DR;
          SetOutput(temp1);
          }
          //從機(jī)需要發(fā)送數(shù)據(jù)
          if((state1 & 0x80) != 0)
          {
          I2C_DR = num++;
          }
          if((state2 & 0x04) != 0)I2C_SR2 &= ~0x04; //應(yīng)答失敗,清除該位
          if((state1 & 0x10) != 0)
          {
          I2C_CR2 = 0x02;
          }
          }
          我寫成這樣子,發(fā)現(xiàn)現(xiàn)在是從機(jī)發(fā)數(shù)據(jù)是沒問題,從機(jī)接收數(shù)據(jù)不行,沒有進(jìn)入中斷。

          成功傳輸一次正確的數(shù)據(jù)后就進(jìn)不去了。程序還正常運(yùn)行

          本文引用地址:http://www.ex-cimer.com/article/201612/325048.htm

          #define I2CAddr 0x01
          在主機(jī)
          //主機(jī)寫數(shù)據(jù),從機(jī)接,這個不行
          Soft_I2C_Start();
          Soft_I2C_Write(0x02);
          Soft_I2C_Write(0xAA);
          Soft_I2C_Stop();
          //主機(jī)接收數(shù)據(jù)。沒有運(yùn)行上一段程序,主機(jī)可以接收數(shù)據(jù),運(yùn)行上段,主機(jī)接收數(shù)據(jù)都是255
          Soft_I2C_Start();
          Soft_I2C_Write(0x03);
          var0=Soft_I2C_Read(1);
          Soft_I2C_Stop();
          這個軟I2C在控制其它設(shè)備是沒有問題的,主機(jī)用的芯片是STM32。應(yīng)該是沒有問題的

          解決問題:

          這就是了,你第一次成功后了,你把應(yīng)答給關(guān)掉了,還怎么接收啊。。。以后配寄存器要多一個心眼才是。

          問題就在這里I2C_CR2 = 0x02; 修改為I2C_CR2 |= 0x02;原因是修改了,第一次成功后,沒有再回復(fù)

          1.PC0,PC1初始化,GPIO_Init(GPIOC, GPIO_Pin_1 | GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast);
          2.必須連接硬件
          3.總線不能busy,一定要空閑
          初始化代碼如下:
          GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Slow);
          GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Slow);
          CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
          I2C_Init(I2C1, 50000, 0xA5, I2C_Mode_I2C, I2C_DutyCycle_2,
          I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
          //注:I2C_Init()里已經(jīng)使能了I2C,所以可以不用I2C_Cmd(I2C1, ENABLE);
          while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

          stm8 自帶I2C終于調(diào)試成功。

          1,此次調(diào)試I2C受益多多,首先證明官方的那個寫EEPROM的程序是對的。
          2,這次調(diào)試TW8816開始調(diào)不通的原因是誤以為寄存器地址是16位的(芯片公司的業(yè)務(wù)也是這么說的,我相信了),才讓我看到的數(shù)據(jù)不同,但我想,有數(shù)據(jù)了,而且用WHILE等待的方法,程序跑通了,說明連上了從機(jī)。
          3, I2C的GPIO不要配置,我看到有些同仁把GPIO配置了。
          4,為了大家用好STM8的I2C,我把程序烤下來。

          void IIC_Init(void)
          {
          UCHAR temp;

          CLK_PCKENR1 |= 0x01;

          I2C_FREQR |= 0x10; //輸入外設(shè)時鐘頻率為1MHz
          I2C_CR1 = 0x00; //禁止I2C外設(shè)
          I2C_CCRH&= ~0xcf;
          I2C_CCRL&= ~0xff;
          I2C_TRISER = 0x11;
          I2C_CCRL = 0x10;
          I2C_CCRH = 0x00;
          I2C_CR1 |= 0x01; //開啟I2C外設(shè)
          I2C_CR2 |= 0x04; //當(dāng)前接收字節(jié)返回應(yīng)答
          I2C_CR2 &= 0x08;
          I2C_OARL = 0x86; //自身地址
          I2C_OARH = 0x40;
          }

          void Read_8816(UCHAR *pBuffer, UCHAR index, UCHAR NumByteToRead)
          {
          UCHAR temp;

          while(I2C_SR3 & 0x02); //等待總線空閑
          I2C_CR2 |= 0x01; //產(chǎn)生起始位
          while(!(I2C_SR1 & 0x01)); //等待START發(fā)送完
          I2C_DR = 0x8a; //發(fā)送8816器件地址
          while(!(I2C_SR1 & 0x02)); //等特7位器件地址發(fā)送完
          temp = I2C_SR1;
          temp = I2C_SR3;
          I2C_DR = (UCHAR)(index);
          while(!(I2C_SR1 & 0x84));

          I2C_CR2 |= 0x01; //產(chǎn)生重復(fù)起始位
          while(!(I2C_SR1 & 0x01)); //等待START發(fā)送完
          I2C_DR = 0x8b; //讀
          while(!(I2C_SR1 & 0x02)); //等特7位器件地址發(fā)送完
          temp = I2C_SR1;
          temp = I2C_SR3;
          while(NumByteToRead) //要讀幾個字節(jié)
          {
          if(NumByteToRead == 1)
          {
          I2C_CR2 &= ~0x04; //不返回應(yīng)答
          I2C_CR2 |= 0x02; //產(chǎn)生停止位
          }
          if(I2C_SR1 & 0x40)
          {
          temp = I2C_SR1;
          Buff[8-NumByteToRead]=I2C_DR;
          *pBuffer = Buff[8-NumByteToRead];
          pBuffer++;
          NumByteToRead--;
          }
          }
          I2C_CR2 |= 0x04;
          I2C_CR2 &= ~0x08; //為下一次接收使能應(yīng)答
          }



          關(guān)鍵詞: STM8S105S4I2

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();