搜索
查看: 1341|回复: 7

[求助] STM8S103飞线外接芯片,I2C不能得到slaveAddress应答,通讯失败。

[复制链接]

该用户从未签到

1

主题

5

帖子

0

蝴蝶豆

新手上路

最后登录
2020-11-25
发表于 2020-11-24 09:04:35 | 显示全部楼层 |阅读模式
STM8S103的板子上,有一个默认自带的AT24C02芯片,I2C读写,程序可以正常工作。
但是当飞线接另一个芯片时,却不能正常通讯,总是死在等待slaveAddress的应答上,I2C通信失败。
请教一下,有人遇到类似问题,如何解决的??

下面是代码:

void Delayms(unsigned int ms)
{
  unsigned int x , y;
  for(x = ms; x > 0; x--)           /*  Í¨¹ýÒ»¶¨ÖÜÆÚÑ­»·½øÐÐÑÓʱ*/
    for(y = 3000 ; y > 0 ; y--);
}


void IIC_Init()
{        
  
    PB_DDR_bit.DDR4 = 1;               
    PB_DDR_bit.DDR5 = 1;               
    PB_ODR_bit.ODR4 = 1;              
    PB_ODR_bit.ODR5 = 1;            
    PB_CR2_bit.C24 = 1;                  
    PB_CR2_bit.C25 = 1;                 
   
   
    I2C_CR2_bit.SWRST = 1;             //I2C1->CR1 |= 1 << 15;         
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    I2C_CR2_bit.SWRST = 0;               
   
    //I2C1->CR2 &= ~I2C_CR2_FREQ;                                                //
    I2C_FREQR_bit.FREQ = 16;          //Freq = 36M

    I2C_CCRH_bit.F_S = 1;         
    I2C_CCRH_bit.DUTY = 0;
    I2C_CCRL = 40;                   //200KHZ  I2CFreq = PCLK1 / CCR / DUTY[λ]        =   16MHZ / 40 / 2 = 200KHZ
   
    I2C_TRISER_bit.TRISE = 16 + 1;                                
   
   // I2C1->CR1 &= ~I2C_CR1_SMBUS;   
    I2C_CR1_bit.ENGC = 1;      
    I2C_CR1_bit.PE = 1;              
  
}



void IIC_Write(unsigned char subaddr , unsigned char Byte_addr , unsigned char *buffer , unsigned short num)
{
    unsigned char i2csr1;
   
   
    //while(I2C1->SR2 & I2C_SR2_BUSY);         
   

    I2C_CR2_bit.START = 1;   
    while(I2C_SR1_bit.SB == 0);   
    i2csr1 = I2C_SR1; //SR1.AF
    I2C_DR = (subaddr);        
    while(I2C_SR1_bit.ADDR == 0);  
    i2csr1 = I2C_SR1;
    i2csr1 = I2C_SR3;        
   

    I2C_DR = Byte_addr;         

    while(I2C_SR1_bit.BTF == 0);  
    i2csr1 = I2C_SR1;        

    while(num > 0)
    {
            I2C_DR = *buffer;      

            while(I2C_SR1_bit.BTF == 0);
            i2csr1 = I2C_SR1;     
            buffer++;
            num--;
    }
    I2C_CR2_bit.STOP = 1;      
}


void IIC_Read(unsigned char subaddr , unsigned char Byte_addr , unsigned char *buffer , unsigned short num)
{
  unsigned char i2csr1;
  
  I2C_CR2_bit.ACK = 1;           
  
  I2C_CR2_bit.START = 1;   
  while(I2C_SR1_bit.SB == 0);  
  i2csr1 = I2C_SR1;        
  I2C_DR = subaddr;      
  while(I2C_SR1_bit.ADDR == 0);  
  i2csr1 = I2C_SR1;
  i2csr1 = I2C_SR3;      

  I2C_DR = Byte_addr;
  while(I2C_SR1_bit.BTF == 0);
  i2csr1 = I2C_SR1;   
  

  I2C_CR2_bit.START = 1;//I2C1->CR1 |= I2C_CR1_START;
  while(I2C_SR1_bit.SB == 0);

  i2csr1 = I2C_SR1;//SR1.AF??
  I2C_DR = (char)(subaddr | 0x01);   
  while(I2C_SR1_bit.ADDR == 0);        
  i2csr1 = I2C_SR1;
  i2csr1 = I2C_SR3;           

  while(num)
  {
    if(num == 1)
    {
        I2C_CR2_bit.ACK = 0;         
        I2C_CR2_bit.STOP = 1;      
    }

    while(I2C_SR1_bit.RXNE == 0);
    i2csr1 = I2C_SR1;

    *buffer = I2C_DR;   
    buffer++;
    num--;
  }
}


回复

使用道具 举报

该用户从未签到

74

主题

3420

帖子

82

蝴蝶豆

社区小助手

最后登录
2023-11-12
发表于 2020-11-24 10:26:49 | 显示全部楼层
如果是同时接了2只24C02芯片,IIC地址可能冲突了,
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

20

主题

1628

帖子

5

蝴蝶豆

论坛元老

最后登录
2022-6-7
发表于 2020-11-24 09:34:38 | 显示全部楼层
既然没飞线的时候是正常的,飞线后不正常了,说明是硬件的问题不是软件的问题啊,把代码贴出来也看不出啥问题的
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

1

主题

5

帖子

0

蝴蝶豆

新手上路

最后登录
2020-11-25
 楼主| 发表于 2020-11-24 10:43:45 | 显示全部楼层
wenyangzeng 发表于 2020-11-24 10:26
如果是同时接了2只24C02芯片,IIC地址可能冲突了,

不是两个24C02芯片,一个24C02是板子自带的,一个是飞线连接的另一个芯片,IIC地址是不一样的。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

5

帖子

0

蝴蝶豆

新手上路

最后登录
2020-11-25
 楼主| 发表于 2020-11-24 10:47:54 | 显示全部楼层
不是两个24C02芯片,一个是板子自带的24C02芯片,一个是飞线连接的外部芯片,I2C地址是不一样的。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

5

帖子

0

蝴蝶豆

新手上路

最后登录
2020-11-25
 楼主| 发表于 2020-11-24 11:31:05 | 显示全部楼层
正常发帖也需要审核 更新速度太慢了
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

5

帖子

0

蝴蝶豆

新手上路

最后登录
2020-11-25
 楼主| 发表于 2020-11-25 09:48:25 | 显示全部楼层
结帖,管理员效率太慢了。
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2020-12-1 10:50:56 | 显示全部楼层
多半是硬件问题造成的,建议楼主用示波器量测一下SDA和SCL信号
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 01:39 , Processed in 0.161609 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表