打印
[STM8]

STM8S的I2C读写不了EEPROM

[复制链接]
2675|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
owenli520|  楼主 | 2015-1-22 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 owenli520 于 2015-1-25 14:19 编辑

STM8S的I2C读写不了EEPROM,使用I2C功能一直处理忙状态,使用模拟方式也读写不了数据,模拟方式验证了可以读写时钟芯片,就是读写不了24C32,模拟方式的程序在其它单片机上一点问题都有,到STM8上就不行了,要崩溃了,求高人指点


实在是不想折腾了,结帖!有需要的请看我的另一帖子
https://bbs.21ic.com/icview-873551-1-1.html
沙发
owenli520|  楼主 | 2015-1-22 10:04 | 只看该作者
//STM8 I/O口模拟I2C

#define I2C_ERR   0
#define I2C_CRR   1
#define  I2CDataIn  1
#define  I2CDataOut 0
#define I2C_PORT  (GPIOB)
#define I2CSCL   (GPIO_PIN_4)
#define I2CSDA   (GPIO_PIN_5)

//***************************************************************
// I2C Data input/output
// 0-Output, 1-Input
//***************************************************************
void I2CDataInOut(bool InOut)
{
if(InOut)
  {
  GPIO_Init(I2C_PORT,I2CSDA,GPIO_MODE_IN_FL_NO_IT);
  }
else
  {
  GPIO_Init(I2C_PORT,I2CSDA,GPIO_MODE_OUT_OD_LOW_FAST);
  }
}
//***************************************************************
//  Send start condition
//  ensure data is high then issue a start condition
//  see also i2c_Start() macro
//***************************************************************
void I2C_Start (void)
{
GPIO_WriteHigh(I2C_PORT, I2CSDA);
_delay_5us(5);
GPIO_WriteHigh(I2C_PORT, I2CSCL);
_delay_5us(5);
GPIO_WriteLow(I2C_PORT, I2CSDA);
_delay_5us(5);
}
//***************************************************************
//   Send stop condition
//   data low-high while clock high
//***************************************************************
void I2C_Stop (void)
{
GPIO_WriteLow(I2C_PORT, I2CSDA);
_delay_5us(5);
GPIO_WriteHigh(I2C_PORT, I2CSCL);
_delay_5us(5);
GPIO_WriteHigh(I2C_PORT, I2CSDA);
}
//***************************************************************
//ROUTINE NAME : I2C_Ack
//INPUT/OUTPUT : None.
//DESCRIPTION  : Acknoledge generation from now.
//COMMENTS     : Transfer sequence = DATA, ACK.
//***************************************************************
void I2C_Rack(void)
{
GPIO_WriteLow(I2C_PORT, I2CSDA);
_delay_5us(5);
GPIO_WriteHigh(I2C_PORT, I2CSCL);
_delay_5us(5);
GPIO_WriteLow(I2C_PORT, I2CSCL);
_delay_5us(5);
}

//***************************************************************
//ROUTINE NAME : I2C_nAck
//INPUT/OUTPUT : None.
//DESCRIPTION  : Non acknoledge generation from now.
//COMMENTS     : Transfer sequence = DATA, NACK.
//***************************************************************
void I2C_nAck (void)
{
GPIO_WriteHigh(I2C_PORT, I2CSDA);
_delay_5us(5);
GPIO_WriteHigh(I2C_PORT, I2CSCL);
_delay_5us(5);
GPIO_WriteLow(I2C_PORT, I2CSCL);
_delay_5us(5);
}
//***************************************************************
//  Send a byte to the slave 写一个数据没有应答
//  return I2C_ERR OR I2C_CRR
//***************************************************************
bool SendByte(UCHAR I2cData)
{
UCHAR i;
bool I2CStatus;

for(i=0; i<8; i++)
  {
  GPIO_WriteLow(I2C_PORT, I2CSCL);
  _delay_5us(5);
  if(I2cData & 0x80)
   {GPIO_WriteHigh(I2C_PORT, I2CSDA);}
  else
   {GPIO_WriteLow(I2C_PORT, I2CSDA);}
  GPIO_WriteHigh(I2C_PORT, I2CSCL);
  _delay_5us(5);
  I2cData <<= 1;
  }
  GPIO_WriteLow(I2C_PORT, I2CSCL);
  GPIO_WriteHigh(I2C_PORT, I2CSDA);//发送完一字节,接收应答
  
  I2CDataInOut(I2CDataIn);

  GPIO_WriteHigh(I2C_PORT, I2CSCL);
  _delay_5us(5);
  if(GPIO_ReadInputPin(I2C_PORT,I2CSDA) == 0)
   {
   I2CStatus = I2C_CRR;
   }
  else
   {
   I2CStatus = I2C_ERR;
   }
  I2CDataInOut(I2CDataOut);
  return I2CStatus;
}

//***************************************************************
//ROUTINE NAME : I2Cm_RxData
//INPUT/OUTPUT : Last byte to receive flag (active high)/Received data byte.
//DESCRIPTION  : Receive a data byte.
//COMMENTS     : Transfer sequence = DATA, ACK, EV7...
//***************************************************************
UCHAR RcvByte(void)
{   
    UCHAR i;
    UCHAR ReadByte=0;
   GPIO_WriteHigh(I2C_PORT, I2CSDA);

I2CDataInOut(I2CDataIn);
_delay_5us(10);
for(i=0; i<8; i++)
  {
   ReadByte <<= 1;
   GPIO_WriteLow(I2C_PORT, I2CSCL);
   _delay_5us(5);
   GPIO_WriteHigh(I2C_PORT, I2CSCL);
   _delay_5us(5);

   if(GPIO_ReadInputPin(I2C_PORT,I2CSDA) == 1)
    {ReadByte |= 0x01;}
   _delay_5us(5);
  }  
GPIO_WriteLow(I2C_PORT, I2CSCL);
I2CDataInOut(I2CDataOut);
_delay_5us(10);
   return ReadByte;
}

/*******************************************************
  读N个数据,参数:
   wrDAdr: write device-address 写器件地址
   wordAdr: word address 读数据的寄存器地址
   rdDAdr: read device-address 读器件地址
   *pRdDat: p->read data 读数据指针
   num: number 需要读数据的个数
*******************************************************/
bool I2C_Read(UCHAR wrDAdr,UCHAR wordAdr,UCHAR *pRdDat,UCHAR num)
{
bool I2CAck;
UCHAR i=0;
UCHAR rdDAdr;
rdDAdr = wrDAdr+1; //读器件地址为写地址加1
I2C_Start();  /*启动I2C*/
_delay_5us(5);
I2CAck = SendByte(wrDAdr); /*发写器件地址*/
if(!I2CAck)
  {
   return I2C_ERR;
  }
I2CAck = SendByte(wordAdr); /*发寄存器地址*/
if(!I2CAck)
  {
   return I2C_ERR;
  }

I2C_Start();   /*重启I2C*/
  I2CAck = SendByte(rdDAdr); /*发读器件地址*/
if(!I2CAck)
  {
   return I2C_ERR;
  }
_delay_5us(5);
for(i=0;i<num-1;i++)
  {
  *(pRdDat+i) = RcvByte();
  I2C_Rack();
   }
if(i==num-1)
  {
  *(pRdDat+i) = RcvByte();
  I2C_nAck();
  }
I2C_Stop();
return I2C_CRR;
}

/*******************************************************
写N个数据,前N-1个要应答,最后一个不要应答
wrDAdr: write device-address 写器件地址
  wordAdr: word address 写数据的寄存器地址
  *pWrDat: p->write data 写数据指针
  num: number  需要写入的数据个数
*******************************************************/
bool I2C_Write(UCHAR wrDAdr,UCHAR wordAdr,UCHAR *pWrDat,UCHAR num)
{
bool I2CAck;
unsigned char i;

I2C_Start();      /*启动I2C*/
_delay_5us(5);
I2CAck = SendByte(wrDAdr); /*发写器件地址*/
if(!I2CAck)
  {
   return I2C_ERR;
  }
I2CAck = SendByte(wordAdr);  /*发要写的寄存器地址*/
if(!I2CAck)
  {
   return I2C_ERR;
  }
for(i=0;i<num-1;i++)
  {
  I2CAck = SendByte(*(pWrDat+i));
  if(!I2CAck)
   {return I2C_ERR;}
  }
if(i==num-1)
  {
  I2CAck = SendByte(*(pWrDat+num-1));
  if(!I2CAck)
   {return I2C_ERR;}
  }
I2C_Stop();
return I2CAck;
}

使用特权

评论回复
板凳
owenli520|  楼主 | 2015-1-22 11:15 | 只看该作者
有没有人知道啊?急啊

使用特权

评论回复
地板
HorribleA| | 2015-1-22 12:55 | 只看该作者
系统时钟不一样 导致的软件延时问题?

使用特权

评论回复
5
owenli520|  楼主 | 2015-1-22 14:43 | 只看该作者
软件延时也调过了,不管用啊,不知道_delay_5us()是不是延时5秒,这段代码也是网上找的

使用特权

评论回复
6
owenli520|  楼主 | 2015-1-22 14:45 | 只看该作者
那位高手能帮忙解决一下啊?怎么没人呢?太安静了

使用特权

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

本版积分规则

7

主题

57

帖子

0

粉丝