STM32的IIC总线是存在bug,感兴趣的可以上网搜一搜。我们可以使用两个I/O口和软件的方式来模拟stm32的iic总线的控制,所以就不需要使用stm32的硬件控制器了,同理数据手册中的I2C库函数也没有用了。
ROM(只读存储器)和RAM(随机存储器)是计算机中常见的两种存储器。它们在功能和特点上有很多区别。
1. 可擦写性:ROM是只读存储器,它的内容在生产过程中被固化,不能被修改或擦除。而RAM是可读写存储器,可以随时修改和擦除其内容。
2. 数据保存:ROM在断电时可以长久保存其中的数据,而RAM需要持续供电以保持数据的存储。
3. 访问速度:由于ROM中的数据是固化的,所以访问速度较快。而RAM中的数据可以随时被修改,所以访问速度相对较慢。
4. 存储容量:ROM的存储容量较大,可以存储大量的数据和程序。而RAM的存储容量相对较小。
5. 用途:ROM主要用于存储计算机的固件和操作系统等重要程序,如BIOS。而RAM则主要用于存储程序和数据,以供CPU进行读写操作。
总之,ROM是只读存储器,内容不能修改,访问速度快,存储容量大,适用于存储固化的数据和程序;而RAM是可读写存储器,内容可以随时修改,访问速度相对较慢,存储容量较小,适用于临时存储数据和程序。
EEPROM:可读可擦除。这个EEPROM是很有用的,例如:
写了一个程序到板子中让一个电机转动,可以通过上位机的设置去改变它的电机转动频率。A地需要电机500rad/min,B地需要电机200rad/min。因为板子的程序是固定的,不能修改,所以我们只能通过上位机去给板子一个参数,改变他的转速。
可以看到有SCL和SDA,分别为时钟线和数据线,所以IIC是同步串行通信。
从数据手册可以看到,A0-A2为地址输入,WP为写保护;
IIC和SPI在多外设的接线上是不同的,SPI每个外设都需要一个片选信号线,而IIC的所有外设都挂在这两个总线上,IIC通过A0-A2地址去选择外设;
R/W则是区分读操作还是写操作。
前面的1k,2k(2kbit)则是表示看芯片的内部存储空间,这里说的AT24C02,则是2K。
查看STM32F103Cx管脚手册可以看到PB6:I2C1_SCL,PB7:I2C1_SDA。因为PB6连接时钟线,stm32必须一直输出高电平和低电平来控制读写,所以在配置的时候PB6就要为输出模式。而PB7为输入时,stm32读取AT24C02,PB7为输出时,stm32传输数据到AT24C02,所以可以把PB7的模式,来回改动,什么时候输入,就设置为输入,什么时候输出,就设置为输出。
#include "bsp_iic_at24c02.h"
//PB6:SCL PB7:SDA
void IIC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_6 | GPIO_Pin_7, Bit_RESET);
}
#ifndef __BSP_IIC_AT24C02_H__
#define __BSP_IIC_AT24C02_H__
#include <stm32f10x.h>
void IIC_Configuration(void);
#endif