3929|2

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

重新发帖 MSP430用I2C方式读写EEPROM的问题。 [复制链接]

现在我把代码贴一下。代码不知道哪里有问题。现在问题是写不进去。I2CReceiveACK函数中SDA_IN一直为1 ,也就是SDA线P3.1一直为高,所以一直停在那里。
//使用MSP430F2618 完成该功能,P3.2 作为SCL,P3.1 作为SDA EEPROM型号为24LC64


#define SDA_1 P3OUT |= BIT1 //SDA = 1
#define SDA_0 P3OUT &= ~BIT1 //SDA = 0
#define SCL_1 P3OUT |= BIT2 //SCL = 1
#define SCL_0 P3OUT &= ~BIT2 //SCL = 0
#define DIR_IN P3DIR &= ~BIT1 //I/O 口为输入
#define DIR_OUT P3DIR |= BIT1 //SDA 输出数据
#define SDA_IN ((P3IN >> 1) & 0x01)





void dly_usec(int time)
{
  for(int j=0;j }

void i2c_start(void)  
{   
  DIR_OUT ;
  SDA_1 ; dly_usec(5) ;
  SCL_1 ; dly_usec(5) ;   
  SDA_0 ; dly_usec(5) ;   
  SCL_0 ; dly_usec(9) ;   
}  
//.............................................................................
void i2c_stop(void)  
{   
  DIR_OUT ;
  SDA_0 ; dly_usec(5);  
  SCL_1 ; dly_usec(6) ;
  SDA_1 ;   
}  

void I2CReceiveACK(void)
{
  SCL_1;
  dly_usec(5);
  DIR_IN;
  while(SDA_IN);
  DIR_OUT;
  SCL_0;
  dly_usec(5);
}
void I2CAcknowledge(void)
{
  DIR_OUT;
  SCL_0;
  SDA_0;
  dly_usec(5) ;
  SCL_1;
  dly_usec(5) ;
  SCL_0;
}
//....先写高位
void i2c_wr(unsigned char wrbyte)   
{  
  unsigned char bit_count = 0 ;   
  DIR_OUT ;
  while(bit_count<8)  
  {  
  SCL_0;
  dly_usec(9) ;   
  if((wrbyte&0x80)==0x80)
  SDA_1;
  else
  SDA_0;
  dly_usec(5) ;
  SCL_1;   
  dly_usec(4) ;
  wrbyte=wrbyte<<1;   
  bit_count++ ;dly_usec(10) ;
  } // increment bit counter(repeat for 8b)
  SCL_0;
  SDA_1;   
  dly_usec(5) ;   
}  
//....先读高位
unsigned char i2c_rd(void) // read an 8b streaming  
{  
  unsigned char bit_count = 0 ,temp, eep_buf;   
  DIR_OUT;
  SCL_0;
  dly_usec(5) ;   
  SDA_1;   
  DIR_IN ;
  while(bit_count<8)   
{
  SCL_1;
  dly_usec(9) ;  
  temp=SDA_IN;   
  dly_usec(9) ;  

  eep_buf=((eep_buf<<1)|temp);
  SCL_0;
  dly_usec(9) ;   
  bit_count++ ;  
  } // increment bit counter(repeat for 8b)  
  return eep_buf ;   
}  

void Byte_Write(unsigned int eep_adr,unsigned char lofsstr,unsigned char *source)
{  
  unsigned char k = 0 ;   
  i2c_start(); // START command  
  i2c_wr(DEV_ADR_WR); // write SLAVE ADDRESS + wr_bit  
  //I2CReceiveACK();
  i2c_wr(eep_adr>>8); // write high address  
  //I2CReceiveACK();
  i2c_wr(eep_adr&0xff) ; // write low address  
  //I2CReceiveACK();
  while(k   {  
  i2c_wr(*source) ; // stream data in the memory  
  I2CReceiveACK();
  source++ ; // increment pointer  
  k++ ; // increment counter  
  } // do until end  
  i2c_stop() ; // STOP command  
  dly_usec(10) ; // final write cycle time  
}   
//............................................................................
void Byte_Read(unsigned int eep_adr,unsigned char lofdstr,unsigned char *dest)
{   
  unsigned char k = 0 ; // auxiliary counter  
  i2c_start() ; // START command  
  i2c_wr(DEV_ADR_WR) ; // write slave address + write_bit  
  // I2CReceiveACK();
  i2c_wr(eep_adr>>8) ; // write the high_byte of the adr  
  // I2CReceiveACK();
  i2c_wr(eep_adr&0xff) ; // write the low_byte of the adr  
  // I2CReceiveACK();
  i2c_start() ; // REPEATED START condition  
  i2c_wr(DEV_ADR_RD) ; // change the direction of the trsf
  // I2CReceiveACK();
  if(lofdstr==1) ; // if single byte string  
  // {;} // do nothing , the byte will be read
  // & the NACK will be sent at the end
  else  
  {
  while(k 1  
  // do for the first (lofdstr-1) bytes
  {  
  *dest = i2c_rd() ; // read byte  
  I2CAcknowledge();
  dest++ ; k++ ;   
  }   
  } // increment pointer & counter  
  *dest = i2c_rd() ; // read the last byte  
  I2CAcknowledge();
  //nack_mcu() ; // send the final NACK (for the last byte)   
  i2c_stop() ;   
}   


main()
{
  while(1)
  {
  unsigned char mybyte;
  unsigned char dst_str[9];  
   
  mybyte=0x02;
  Byte_Write(0x00,1,&mybyte);   
  Byte_Read(0x00,1,dst_str);
  }
}

最新回复

检查时序和电路,SCL和SDA要加上拉  详情 回复 发表于 2010-6-30 10:44
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
I2CReceiveACK函数中SDA_IN一直为1,说明从机没有正常应答,假如硬件没有连接错或者接触不良的话,应该是时序问题,而且是基本时序,但是我大概看了看,有一个可疑的地方就是延时。问题很可能出在延时上。因为其他开始,停止都是这样顺序的,就是这个void dly_usec(int time)不确定。你要根据你现在的机器周期来大概算算这个延时是多大的。然后看它符合IIC的时序要求不?
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
检查时序和电路,SCL和SDA要加上拉
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表