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条回答
wangkj22
1楼-- · 2019-03-26 00:45
这款芯片没有用过。
1. 看看芯片的勘误表,Microchip芯片的bug不少;
2. 硬件配置字是不是正确,是否把I2C口又配置成别的功能了;
3. I2C设备Slave地址是不是正确的,这个好像要除2的,也就是说是不算R/W位的7位地址;
4. 拿示波器看看时序,
5. 如果你用的ICD2,那么还是可以设断点的,就是反应很慢。
6. 找个例子试试,Microchip公司的网站上应该有。

solider
2楼-- · 2019-03-26 05:08
先谢谢你了啊,勘误表上只说到两点
1.SSP的start bit,fail to regonize start bit
2.SSP的SSPIF Flag,SSPIF Set on first reception only.
这个不太清除具体有什么关联。
另外I2C的SPPCON都已经配置成从机,7位地址模式了,就算是吧地址字节改为7位的0x50也不行
,所以就没能发出应答和数据。网上一些例子都是关于用PIC当主机去读取EEPROM的,和这个不太接近。PDF的这部分也阅读了多次,就是感觉欠缺了谢什么,所以程序没进入中断,郁闷啊。。。
似曾相识
3楼-- · 2019-03-26 08:04
 精彩回答 2  元偷偷看……
xiangshui
4楼-- · 2019-03-26 13:52
拿示波器量,看看波形。
如果波形不对,先看硬件, 再看软件:
1. SDA/SCL是否正确上拉;
2. 有没有共地;
3. 电压是否正确匹配
....
wbatjd
5楼-- · 2019-03-26 16:36
引用 4 楼 zyzhang365 的回复:
拿示波器量,看看波形。
如果波形不对,先看硬件, 再看软件:
1. SDA/SCL是否正确上拉;
2. 有没有共地;
3. 电压是否正确匹配
....


先不要使用400k的高速模式,另外你的主机程序可能也有问题。
jhon
6楼-- · 2019-03-26 20:45
stm32有i2c啊
为什么要模拟呢?

一周热门 更多>