野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9173|回复: 4

模拟I2C问题-EEPROM

[复制链接]
发表于 2021-10-13 20:05:54 | 显示全部楼层 |阅读模式
本帖最后由 RyanLi 于 2021-10-16 09:54 编辑

问题已解决,自己摸索着找到原因了,不知道怎么删帖



写入多个字节函数只能写入3个字节,后面的字节数据丢失

野火论坛202110132005403465..png

I2C.rar

4.55 MB, 下载次数: 17

源码

回复

使用道具 举报

 楼主| 发表于 2021-10-13 20:06:23 | 显示全部楼层
/**
* @file bsp_i2c_ee.c
* @author your name (you@domain.com)
* @brief EEPROM
* @version 0.1
* @date 2021-10-10
*
* @copyright Copyright (c) 2021
*
*/

#include "bsp_i2c_ee.h"
#include "bsp_i2c_gpio.h"

//检测EEPROM 是否存在
//1:不存在  0:存在
uint8_t ee_CHECK_DEVICE(uint8_t addr)
{
   uint8_t result;
   //产生起始信号
   i2c_START();
   //写入设备地址
   i2c_WRITE_BYTE(addr);

   result = i2c_WAIT_ASK();

   i2c_NASK();
   //产生结束信号
   i2c_STOP();

   return result;
}

//等待EEPROM内部完成 1表示超时,0表示正常
uint8_t ee_WaitStandby(void)
{
   uint16_t cycle = 0;

   while (ee_CHECK_DEVICE(EEPROM_ADDR | EEPROM_WRITE_DIR))
   {
      if (cycle++ > 0xffff)
      {
         return 1;
      }
   }
   return 0;
}

//1:不正常  0:正常
//往EEPROM写入一个字节
uint8_t ee_WRITE_BYTES(uint8_t w_addr, uint8_t *w_data, uint8_t w_size)
{
   uint8_t i;
   if (ee_WaitStandby() == 1)
      goto w_fail;

   //产生起始信号
   i2c_START();
   //写入设备地址
   i2c_WRITE_BYTE(EEPROM_ADDR | EEPROM_WRITE_DIR);
   if (i2c_WAIT_ASK())
   {
      goto w_fail;
   }
   else
   {
      //发送要写入的储存单元格
      i2c_WRITE_BYTE(w_addr);
      if (i2c_WAIT_ASK())
      {
         goto w_fail;
      }
      else
      {
         for (i = 0; i < w_size; i++)
         {
            //写入一个字节
            i2c_WRITE_BYTE(*w_data);
            if (i2c_WAIT_ASK())
            {
               goto w_fail;
            }
            w_data++;
         }
      }
   }

   //产生结束信号
   i2c_STOP();
   if (ee_WaitStandby() == 1)
      goto w_fail;
   return 0;

//发生异常
w_fail:
   i2c_STOP();
   return 1;
}

//从EEPROM读取一个字节
uint8_t ee_READ_BYTES(uint8_t r_addr, uint8_t *r_data, uint8_t r_size)
{

   if (ee_WaitStandby() == 1)
      goto r_fail;

   //产生起始信号
   i2c_START();
   //写入设备地址
   i2c_WRITE_BYTE(EEPROM_ADDR | EEPROM_WRITE_DIR);
   if (i2c_WAIT_ASK())
   {
      goto r_fail;
   }
   else
   {
      //发送要读取的储存单元
      i2c_WRITE_BYTE(r_addr);
   }

   if (i2c_WAIT_ASK())
   {
      goto r_fail;
   }
   else
   {
      uint8_t i;
      //产生第二次起始信号
      i2c_START();
      //写入读取设备地址
      i2c_WRITE_BYTE(EEPROM_ADDR | EEPROM_READ_DIR);
      if (i2c_WAIT_ASK())
      {
         goto r_fail;
      }
      else
      {
         for (i = 0; i < r_size; i++)
         {
            //读取一个字节
            *r_data = i2c_READ_BYTE();
            if (i == r_size - 1)
            {
               //产生非应答信号
               i2c_NASK();
            }
            else
            {
               i2c_ASK();
            }
            r_data++;
         }
      }
   }
   // //产生非应答信号
   // i2c_NASK();
   //产生结束信号
   i2c_STOP();
   return 0;

//发生异常
r_fail:
   i2c_STOP();
   return 1;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-13 20:24:10 | 显示全部楼层

#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./uart/bsp_uart.h"
#include "./i2c/bsp_i2c_gpio.h"
#include "./i2c/bsp_i2c_ee.h"



void delay(uint32_t count)
{
        int j;
        for (; count != 0; count--)
        {
                for (j = 1000; j != 0; j--);
        }
}

int main()
{
        uint8_t w_data[10] = {0,1,2,3,4,5,6,7,8};
        uint8_t r_data[10] = {0};
        uint8_t i;
        UART_Config();
        I2C_GPIO_Config();

        printf("中文EEPROM\n\n");

        if (ee_CHECK_DEVICE(EEPROM_ADDR | EEPROM_WRITE_DIR) == 0)
        {
                printf("检测正常\n");
        }
        else
        {
                printf("检测异常\n");
        }

        if (ee_WRITE_BYTES(5, w_data, 8) == 0)
        {
                printf("写入到EEPROM\n");
        }
        else
        {
                printf("写入异常\n");
        }

        if (ee_READ_BYTES(5, r_data, 10) == 0)
        {
                printf("读取的值为:\n");
                for(i=0; i<10; i++)
                {
                        printf("%d ", r_data[i]);
                }
        }
        else
        {
                printf("读取异常\n");
        }

        while (1);
}
回复 支持 反对

使用道具 举报

发表于 2021-10-14 09:41:29 | 显示全部楼层
帮你修改好了,有什么不足可以一起讨论一下
野火论坛202110140940306471..png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-14 11:28:43 | 显示全部楼层
Summer-Q1X3T5 发表于 2021-10-14 09:41
帮你修改好了,有什么不足可以一起讨论一下

你好,请问要更改那一部分代码?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-22 19:34 , Processed in 0.051188 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表