PIC的I2C接口从机通信错误,未能发出数据

2019-03-25 19:50发布

1.用STM32的芯片做主机,PIC16F677作为从机作数据采集。主机用模拟方式实现IIC通信,速率是400K,从机是通过配置相关的IIC寄存器实现。
2.上电后用示波器观察,主机有发送配置地址0XF0和10连续的共10个位的数据。
3.发送的地址和677的SSPADD配置地址0XF0是匹配的,但是没有数据由677发送过来。
疑问:
1.主机发送地址子节后的10两个位数据是否是从机的问应答信号。
2.因为我们的PIC仿真器好像不支持在线调试,从主机发完地址后没接收到从机的ASK,而从机的ASK是由硬件自动完成的,所以现在基本可以判定677是未进入中断,不知道这种看法是否正确。
3.677的配置和程序方面还有哪些欠缺和不足。

已经调试了好几天,但从机就是不发信号出来,请大家帮我看一下,到底问题在哪里?万分感谢

以下是PIC的I2C初始化配置和ISR:
void init_I2C( void )
{
INTCON |=0xc0; //enable GIE,PEIE  
PIE1 |=0x08;  //enable SSPIE 外设同步串行口中断使能位
SSPSTAT &=0x3F;  //0011 1111:

//  SSPSTAT &=0x00;
  SSPCON = 0x36; //00110110: Enable SSPEN, Enable SCL, I2C 从模式,7Bits地址
//SSPCON = 0x3E;

  SSPADD = 0xF0; //最高位8位为读写标志位R/W,1为读,即向STM32主机发送数据
  SSPMSK=0xFE;  //bit0 不起作用
  CLR_I2C_BF;   //read to clear BF flag.
  // clear pending interrupts and enable I2C interrupts
  CLR_SSPIF;
  
  
}

void interrupt SlaveI2CHandler(void)

{
   
    if ((RW == 0)&&(DA==0))//寻址后,并由移位寄存器SSPSR和地址寄存器SSPADD自动比较是否匹配,
                                       //如果匹配RW由硬件自动完成置0;
     {  // write data to PIC MCU, ignore it and perform a dummy read
                CLR_I2C_BF;
       
                HOLD_SCL;


             // delay_100us();
                CLR_SSPOV;
                 CLR_SSPIF;
               
     }
     else if ((RW == 0)&&(DA==1))
    {
        RLS_SCL;
        CLR_SSPIF;
    }
    else if((RW == 1)&&(DA==0)) //接收和发送的最后一个字节是地址,则向STM32发送数据
        {                                // READ data from MCU and address match 0
                
                CLR_I2C_BF;
                SSPBUF=LongLength;           //LongLength
                RLS_SCL;
                //        SSPSR=LongLength;//SSPSR不可直接访问,只能通过SSPBUF
               
                     while(BF==1);;//加入延时直到一个字节接收完毕才清中断
                CLR_SSPIF;
                CLR_SSPOV;
        }
  
下面是STM32的主机程序:

STM32主程序通过 Read_A_Byte函数来调用IIC接口数据传输
Read_A_Byte(0XF0,(u8 *)IIC_Read_Temp);

u8 Read_A_Byte(unsigned char ChipAddr,unsigned char *Data) //read a byte from EEPROM  (unsigned char ChipAddr,unsigned char addr,unsigned char *Data) //rea
{
unsigned char  Data_Temp=0;
unsigned char  Chip;
Chip=ChipAddr;

// Chip&=0xF1;
IIC_Start();
Write_Byte(Chip);
if(!IIC_Check_Ack()){IIC_Stop();return 0;} //read error

Data_Temp=Read_Byte_1();
NoAck();
IIC_Stop();
*Data=Data_Temp;
return 1; //Read correct return true
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
wbatjd
2019-03-26 16:36
引用 4 楼 zyzhang365 的回复:
拿示波器量,看看波形。
如果波形不对,先看硬件, 再看软件:
1. SDA/SCL是否正确上拉;
2. 有没有共地;
3. 电压是否正确匹配
....


先不要使用400k的高速模式,另外你的主机程序可能也有问题。

一周热门 更多>