6438|6

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

PIC的I2C接口从机通信错误,未能发出数据 [复制链接]

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
}

最新回复

stm32有i2c啊 为什么要模拟呢?  详情 回复 发表于 2009-6-26 13:14
点赞 关注
 

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

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

 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
先谢谢你了啊,勘误表上只说到两点
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的这部分也阅读了多次,就是感觉欠缺了谢什么,所以程序没进入中断,郁闷啊。。。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
做过I2C的应该不难找出我这个的原因吧,不过你的意见还是很有用的
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

5
 
拿示波器量,看看波形。
如果波形不对,先看硬件, 再看软件:
1. SDA/SCL是否正确上拉;
2. 有没有共地;
3. 电压是否正确匹配
....
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 zyzhang365 的回复:
拿示波器量,看看波形。
如果波形不对,先看硬件, 再看软件:
1. SDA/SCL是否正确上拉;
2. 有没有共地;
3. 电压是否正确匹配
....


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

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
stm32有i2c啊
为什么要模拟呢?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表