打印

PIC16F877的I2C 问题(请高手指点!!)

[复制链接]
3155|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用PIC16F877的i2c向24c02写数据的问题
为何写不进数据呢,郁闷中~~~

初始化程序如下:
//数据传送函数
void SendByte(unsigned char Data)
{
  SSPBUF=Data;
}

//I2c初始化函数   
void InitialI2c(void)
{
  TRISC3=1;       //设置为输入
  TRISC4=1;
  
  SSPSTAT=0x00;  //初始化SSPSTAT
  SSPCON=0x08;   //7位地址
  SSPCON2=0x00;
  SSPADD=0x09;   //设定I2C 时钟频率
  
  SSPEN=1;    //SSP模块使能
  SSPIF=0;   
}

//i2c总线忙检测
void I2c_Idle(void)
{
  while((SSPCON2 & 0x1f)|RW);//RW当传输完一个数据时,RW=0;
}

//标志位
void Flag_SSPIF(void)
{
  while(!SSPIF); //当发送第九个脉冲时,SSPIF置1
  SSPIF=0;   //即等待ack应答信号
}

//写一个数据到 24c02的指定的地址
void WriteOneData(unsigned char Command,unsigned char Data)
{
  SEN=1;   //一旦启动,则使SSPIF置1
  Flag_SSPIF();

  SendByte(0xA0); //发送从机地址  
  Flag_SSPIF();     
  
  SendByte(Command);
  Flag_SSPIF();
  
  
  SendByte(Data);
  Flag_SSPIF();

  PEN=1;
  Flag_SSPIF();
}

主程序如下:
#include"i2c.h"
#include"pic1687x.h"
void main(void)
{
   InitialI2c();
   I2c_Idle();

   while(1)
    {
         WriteOneData(0x33,0xaa);
    }
}

仿真波形如下:

波形图.gif (501.77 KB )

波形图.gif
沙发
wushaorong88|  楼主 | 2010-7-19 22:26 | 只看该作者
就感觉没收到24c02的应答信号!!
收应答信号又要怎么操作???

使用特权

评论回复
板凳
cheungman| | 2010-7-20 17:14 | 只看该作者
本帖最后由 cheungman 于 2010-7-20 17:17 编辑

问题出在这一句
   while(1)
    {
         WriteOneData(0x33,0xaa);   //不停发起i2c与eeprom通信,而eeprom又在写操作中,不会应答的
    }
写eeprom,需要等待eeprom写完,所以主控IC要不停检测eeprom写完没有,也就是检测eeprom有没有应答,只有有应答后主控IC才继续发起第二次I2C通信。

程序应该写成这样:
1.启动总线
2.发送从机地址
3.检测 ACKSTAT的信号,0为收到eeprom的应答,1为未收到应答
4.未收到应答,重启总线,从步骤2继续
5.收到应该,关闭总线

使用特权

评论回复
地板
wushaorong88|  楼主 | 2010-7-20 21:17 | 只看该作者
回复3:

根据像楼上所说,还是收不到应答呀
                do
                {
                        SEN=1;                        //一旦启动,则使SSPIF置1
                        Flag_SSPIF();
                       
                        SendByte(0xA0);        //发送从机地址               
                        Flag_SSPIF();
                 }
                 while(ACKSTAT);

使用特权

评论回复
5
machunshui| | 2010-7-21 09:25 | 只看该作者
可以到microchip网站上找个例子看看

使用特权

评论回复
6
cheungman| | 2010-7-22 17:41 | 只看该作者
回复3:

根据像楼上所说,还是收不到应答呀
                do
                {
                        SEN=1;                        //一旦启动,则使SSPIF置1
                        Flag_SSPIF();
                        
                        SendByte(0xA0);        //发送从机地址               
                        Flag_SSPIF();
                 }
                 while(ACKSTAT); ...
wushaorong88 发表于 2010-7-20 21:17



SEN=1;                     
Flag_SSPIF();
                        
SendByte(0xA0);                     
Flag_SSPIF();

while (ACKSTAT)
{
RSEN = 1;
Flag_SSPIF();

SendByte(0xA0);                     
Flag_SSPIF();
}
PEN=1;
Flag_SSPIF();

使用特权

评论回复
7
machunshui| | 2010-7-24 23:55 | 只看该作者
http://www.microchip.com/stellen ... mp;appnote=en022366

microchip网站有非常详细的例子和说明

使用特权

评论回复
8
bqyuuu| | 2010-8-4 22:38 | 只看该作者
建议楼主用单步执行,注意看各寄存器的值,比如SSPIF,BF,RW,看这些标志位是否按预期变化,这样子大概可以追询到那个步骤出现问题了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

75

帖子

1

粉丝