嵌入式蓝桥杯-iIC的应用 eeprom

目录

1.stm32cubemx设置

2.代码实现

        1.主要使用的函数

        2.示例



前言

I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备

物理I2C接口有两根双向线,串行时钟线(SCL)串行数据线(SDA)组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。

  • 启动条件:
    SCL高的时候SDA从高到低的过渡是一个启动条件。

  • 停止条件:
    SCL高的SDA从低到高的转变是停止条件。在读取序列之后,stop命令将EEPROM置于备用电源模式。

蓝桥杯在资料包里会给我们iIC的驱动文件,我们只需要将驱动文件添加到自己的工程里使用

1.stm32cubemx设置

我们在使用cubemx是一定要初始化PB端口的一个引脚,目的是使能PB端口 

系统时钟的设置 

2.代码实现

        1.主要使用的函数

void I2CStart(void);//开启iIC
void I2CStop(void);//停止iIC
unsigned char I2CWaitAck(void);//等待iIC的相应

void I2CSendByte(unsigned char cSendByte);//发送数据
unsigned char I2CReceiveByte(void);//读取数据
void I2CInit(void);//初始化iIC

void x24c02_w(unsigned char address,unsigned char info);//向eeprom写入数据(用户自己编写)
uint8_t x24c02_r(unsigned char address);//读取eeprom数据(用户自己编写)

我们需要注意存储地址是八位,所以存储地址是0到0xff,每个地址存储的大小是八位,所以存储的数据是从0到255(如果你没有使用向eeprom里存储东西,默认值是255)

//将数据写入eeprom
void x24c02_w(unsigned char address,unsigned char info)
{
	I2CStart();
	I2CSendByte(0xa0);//向所有从机发送eeprom的设备地址即模式(只有eeprom会相应)
	I2CWaitAck();//等待响应
	
	I2CSendByte(address);//发送所要存储的地址
	I2CWaitAck();
	I2CSendByte(info);//发送存储数据
	I2CWaitAck();
	I2CStop();
}

//读取目的地址eeprom的数据
uint8_t x24c02_r(unsigned char address)
{
	unsigned char val;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	
	I2CSendByte(address);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0xa1);//更改eeprom的模式,设置成读
	I2CWaitAck();
	val=I2CReceiveByte();//接收读取的数据
	I2CStop();
	
	return val;
}

        2.示例

int main(void)
{
  /* USER CODE BEGIN 1 */
	uint8_t Num=10;
	uint8_t str[20];
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//¹Ø±ÕËø´æÆ÷±£³ÖledµÄ״̬
	
	I2CInit();
	LCD_Init();
	LCD_Clear(White);
	LCD_SetBackColor(White);
	LCD_SetTextColor(Black);
	x24c02_w(0x00,10);
	HAL_Delay(10);//使用发现这里放延时函数十分有必要,可以短一些,特别是下一步就开始读的时候
	Num=x24c02_r(0x00);
	LCD_DisplayChar(Line5, 320-(10*16), Num+'0');
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

我们可以直接初始化eeprom里面的数据为0,使用for循环实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值