打印
[STM8]

关于STM8l读取AT24C512的数读取错误

[复制链接]
1234|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zkppp|  楼主 | 2015-8-4 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用STM8L与EEPROM芯片AT24C512通信的时候,出现了一点问题
因为STM8和STM32的库函数相似,所以参考了野火教程里EEPROM的代码,修改移植到STM8L上

STM8L_I2C.zip (2.69 KB)

读函数
void EEPROM_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t NumByteToRead)
{

    /*!< While the bus is busy */
    while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
    /*!< Send START condition */
    I2C_GenerateSTART(I2C1, ENABLE);
    /*!< Test on EV5 and clear it */
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
    /*!< Send EEPROM address for write */
    I2C_Send7bitAddress(I2C1, 0xa0, I2C_Direction_Transmitter);
    /*!< Test on EV6 and clear it */
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    I2C_Cmd(I2C1, ENABLE);
    I2C_SendData(I2C1, ReadAddr);
    /*!< Test on EV8 and clear it */
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    /*!< Send STRAT condition a second time */
    I2C_GenerateSTART(I2C1, ENABLE);
    /*!< Test on EV5 and clear it */
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
    /*!< Send EEPROM address for read */
    I2C_Send7bitAddress(I2C1, 0xa0, I2C_Direction_Receiver);
    /*!< Test on EV6 and clear it */
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
   
/* While there is data to be read */
    while (NumByteToRead)
    {
        if (NumByteToRead == 1)
        {
            /* Disable Acknowledgement */
            I2C_AcknowledgeConfig(I2C1, DISABLE);

            /* Send STOP Condition */
            I2C_GenerateSTOP(I2C1, ENABLE);
        }
        /* Test on EV7 and clear it */
        if (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
        {
            /* Read a byte from the EEPROM */
            *pBuffer = I2C_ReceiveData(I2C1);
            /* Point to the next location where the byte read will be
            68 saved */
            pBuffer++;
            /* Decrement the read bytes counter */
            NumByteToRead--;
        }
    }
    I2C_AcknowledgeConfig(I2C1, ENABLE);
}

写函数
void EEPROM_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite)
{
    uint8_t NumOfPage = 0, NumOfSingle = 0, count = 0;
    uint16_t Addr = 0;

    Addr = WriteAddr % I2C_PageSize;
    count = (uint8_t)(I2C_PageSize - (uint16_t)Addr);
    NumOfPage =  (uint8_t)(NumByteToWrite / I2C_PageSize);
    NumOfSingle = (uint8_t)(NumByteToWrite % I2C_PageSize);

    if (Addr == 0)
    {
        if (NumOfPage == 0)
        {
          EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)NumOfSingle);
          EEPROM_WaitEepromStandbyState();
      }
    else
    {
        while (NumOfPage--)
        {
            EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)I2C_PageSize);
            EEPROM_WaitEepromStandbyState();
            WriteAddr +=  I2C_PageSize;
            pBuffer += I2C_PageSize;
        }

        if (NumOfSingle != 0)
        {
            EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)NumOfSingle);
            EEPROM_WaitEepromStandbyState();
        }
      }
    }
  else
  {
    if (NumOfPage == 0)
    {
          EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)NumOfSingle);
          EEPROM_WaitEepromStandbyState();
    }
    else
    {
        NumByteToWrite -= count;
        NumOfPage = (uint8_t)(NumByteToWrite / I2C_PageSize);
        NumOfSingle = (uint8_t)(NumByteToWrite % I2C_PageSize);

        if (count != 0)
        {
            EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)count);
            EEPROM_WaitEepromStandbyState();
            WriteAddr += count;
            pBuffer += count;
        }

        while (NumOfPage--)
        {
            EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)I2C_PageSize);
            EEPROM_WaitEepromStandbyState();
            WriteAddr +=  I2C_PageSize;
            pBuffer += I2C_PageSize;
        }
        if (NumOfSingle != 0)
        {
            EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)NumOfSingle);
            EEPROM_WaitEepromStandbyState();
        }
    }
  }
}

写页函数

void EEPROM_WritePage(uint8_t* pBuffer, uint16_t WriteAddr, uint8_t* NumByteToWrite)
{
      while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
      /*!< Send START condition */
      I2C_GenerateSTART(I2C1, ENABLE);
      /*!< Test on EV5 and clear it */
      while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
      /*!< Send EEPROM address for write */
      I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Transmitter);
      /*!< Test on EV6 and clear it */
      while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
      
      I2C_SendData(I2C1, WriteAddr);
      /*!< Test on EV8 and clear it */
      while (! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
      
      while (NumByteToWrite--)
      {
          /* Send the current byte */
          I2C_SendData(I2C1, *pBuffer);
          /* Point to the next byte to be written */
          pBuffer++;
          /* Test on EV8 and clear it */
          while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
      }
      /*!< Send STOP condition */
      I2C_GenerateSTOP(I2C1, ENABLE);
  
}

测试函数
void EEPROM_Test()
{
    uint16_t i = 0;
   
    for(i = 0; i < 5; i++)
    {
        printf("The Write Data is %d\n", test_Write);
    }
   
    EEPROM_WriteBuffer(test_Write, EEPROM_Firstpage, 5);
    printf("Write success!\r\n");
    delay_ms(50);
    printf("Read Data\r\n");
    delay_ms(10);
    EEPROM_ReadBuffer(test_Read, 0x01, 5);
    delay_ms(10);
    for(i = 0; i < 5; i++)
    {
        printf("The Read Data is %d\n", test_Read);
    }
   
}

但是出现写完成后,读数始终为ff的结果
现在有点迷糊,我该如何判断是写函数出问题还是读函数出问题,或者是都有问题呢?
请各位大大指教

沙发
SLHSu37| | 2015-8-4 09:59 | 只看该作者
硬件IIC?一直用模拟的来着

使用特权

评论回复
板凳
zkppp|  楼主 | 2015-8-4 10:01 | 只看该作者
SLHSu37 发表于 2015-8-4 09:59
硬件IIC?一直用模拟的来着

唔,在考虑要不要换模拟了已经,但是希望是用硬件实现

使用特权

评论回复
地板
SLHSu37| | 2015-8-4 10:05 | 只看该作者
那就在好好查查吧,用示波器、逻辑分析仪神马的看看波形

使用特权

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

本版积分规则

5

主题

23

帖子

0

粉丝