你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3617|回复: 1

STM8 I2C仿真上遇到的問題

[复制链接]

3

主题

8

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2012-10-23 19:46:03 | 显示全部楼层 |阅读模式
請問各位高手,以下的程式是針對STM8-128-EVAL demonstration firmware去修改的
環境是使用stvd 4.3.2
在仿真過程中,只有第一次剛送電仿真的時,程式可以順利執行過紅字的部分
但是如果chip reset之後,程式執行都會停在紅字的部分,請問該如何解決??
另外有哪些暫存器會影響I2C_SR1的START BIT的變化,由於是參考原廠提供的LIBRARY修改的
沒道理START bit不會enable阿 疑問....
 
 void Read_HAF(void)
{
  
        uint8_t i = 0x00;
        uint8_t j = 0x00;
        I2C_Cmd( ENABLE);
  /* Re-send start & wait event detection */
  I2C_GenerateSTART(ENABLE);
        j=I2C->SR1;
        while(!(I2C->SR1 & 0x01));
       
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
 
  /* Send slave Address in read direction & wait event */
  I2C_Send7bitAddress(0x92, I2C_DIRECTION_RX);
  while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  //I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
 
        I2C_AcknowledgeConfig(I2C_ACK_NEXT);
       
        while(I2C_GetFlagStatus( I2C_FLAG_ADDRESSSENTMATCHED) == RESET);
  
        I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);  
  (void)I2C->SR3;
        I2C_AcknowledgeConfig(I2C_ACK_NONE);
       
        I2C_GenerateSTOP(ENABLE);
  
  EEPBuffer = (uint8_t)(I2C_ReceiveData());
       
        //while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
  
        i++;
       
        EEPBuffer = (uint8_t)(I2C_ReceiveData());       
  /* Send STOP Condition to end transmission */
  
}
回复

使用道具 举报

3

主题

8

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2012-10-31 15:48:21 | 显示全部楼层

回复:STM8 I2C仿真上遇到的問題

請教各位先進,經由連日的修改 ,i2c已可以正常通訊
程式如下,但是遇到個問題
經由示波器顯示的波形與認知的不同
依程式來看位址後接兩個byte date就應該要stop
但是實際狀況是兩個byte date接續出現0xff 之後才stop.
可是i2c_DR的內容兩個byte date又都有接收到
所以是哪邊有遺漏需改正
請指教
 void main(void)
{
  Init_Application();
  EEPBuffer[0] = 0x00;
do
{
    int NumByteToRead=2;
    int        i=0;
    I2C_GenerateSTART(ENABLE);
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
  
  /* Send EEPROM address for read */
  I2C_Send7bitAddress(0x92,I2C_DIRECTION_RX);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  
  /* While there is data to be read */
  while(NumByteToRead)  
  {
        if(I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED))  
    { 
    if(NumByteToRead == 2)
            {
            I2C_AcknowledgeConfig(I2C_ACK_NONE);
                        //I2C_AcknowledgeConfig(DISABLE);
            }
     if(NumByteToRead == 1)
             {
                        //I2C_AcknowledgeConfig(I2C_ACK_NONE);
              I2C_GenerateSTOP(ENABLE);
             }
      /* Read a byte from the EEPROM */
      EEPBuffer = I2C_ReceiveData();
 
      /* Point to the next location where the byte read will be saved */
      i++; 
      
      /* Decrement the read bytes counter */
      NumByteToRead--;        
    }   
  }
 
  /* Enable Acknowledgement to be ready for another reception */
  I2C_AcknowledgeConfig(I2C_ACK_CURR);
  }while(1);
 
}
 
 
stm8 I2C.jpg
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版