1. 首页
  2. 技术文章

STM32F10x学习笔记–硬件I2C通讯AT24C02第一篇之I2C的介绍与初始化

  • I2C介绍

I2C总线这部分网络上资料齐全,我这里就不多说了。在这里我主要介绍下,学习通信EEPROM相关需要知道的地方。首先,需要准备以下资料:

  1. AT24C02的数据手册;
  2. STM32F10x中文参考手册;
  3. STM32F10x固件库手册;

以上资料相关部分最好是看过的,主要是AT24C02数据手册一定要看明白,中文手册看一下I2C部分,在24章节开始。库函数打开Modules-STM32F10x_StdPeriph_Driver-I2C这里目录下。

      看完AT24C02手册我们需要大概知道:

  1. I2C总线支持400kHz;
  2. AT24C02有三个输入地址A2,A1,A0;拉高为1,拉低为0,带入下面公式:

MSB                                                                                                                                  LSB

1

0 1 0 A2 A1 A0

R/W

其中高四位为固定值:1010,

低四位:A2 A1 A0 加上 R(=1)还是W(=0)

这样就组成了8位1个字节的EEPROM的地址,显然地址有两个,假设A2A1A0都为低电平,那么一个写地址为:二进制10100000==十六进制0xA0读地址则为:二进制10100001==十六进制      0xA1;这就是EEPROM地址的由来。

  1. AT24C02 大小为2K,内部含有32个页面,每一个页面包含了8个字节。

     看完STM32F10x中文参考手册和库文件手册我们需要大概知道:

  1. STM32的I2C总线支持100kHz和400kHz速率
  2. STM32的I2C 两个引脚需要配置成开漏复用输出模式,在手册8.1.11章节有介绍。
  3. I2C初始化结构体都有哪些?库文件手册介绍了以下结构体
uint16_t I2C_Ack
uint16_t I2C_AcknowledgedAddress
uint32_t I2C_ClockSpeed
uint16_t I2C_DutyCycle
uint16_t I2C_Mode
uint16_t I2C_OwnAddress1

每一个含义手册里说明的很清楚。

  • 初始化代码

 首先进行GPIO初始化:

void eeprom_I2C_GPIO_Config(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;

/*使能时钟 */
RCC_APB1PeriphClockCmd (RCC_APB1Periph_I2C1, ENABLE );
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB, ENABLE );

/* 初始化SCL和SDA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;   // SCA
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;   // SDA

GPIO_Init(GPIOB, &GPIO_InitStructure);
}

GPIO的初始化比较简单,I2C1的时钟在APB1上,GPIO都在APB2上,上面介绍了I2C的SCL和SDA都是需要配置成开漏复用输出模式。

然后对I2C工作模式GPIO初始化:

void eeprom_I2C_Workmode_Config(void)
{
I2C_InitTypeDef  I2C_InitStructure;

/* 功能选择 可选:I2C 模式 SUMBUS 模式 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

/* 占空比选择 默认1/2  16:9也可以选择 不影响 */
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

/* STM32自己I2C的地址 只需要和外挂设备地址不一致即可 但是需要保证与外挂设备地址长度一致 7位二进制地址 */
I2C_InitStructure.I2C_OwnAddress1 =0x0a;

/* 使能I2C应答功能 */
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;

/* 通讯 寻址模式 */
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

/* 通讯的速率 */
I2C_InitStructure.I2C_ClockSpeed = I2C_eeprom_Speed;

/* 初始化I2C1 */
I2C_Init(I2C1, &I2C_InitStructure);

/* 使能I2C1 */
I2C_Cmd(I2C1, ENABLE);
}

I2C工作模式的初始化,代码中注释写的很明白了,其中0x0a是STM32自己的地址,因为I2C总线上所有设备都必须有地址,这里地址必须是7位并且和EEPROM的不同就可以。I2C_eeprom_Speed 这里调用了一个宏,在.h文件中定义了#define I2C_eeprom_Speed  400000, 也就是说配置通讯速率位400kHz。

最后封装到新的函数中,放在Main函数中进行调用初始化即可

void eeprom_I2C_open(void)
{
eeprom_I2C_GPIO_Config();
eeprom_I2C_Workmode_Config() ;
}

把这个函数调用以下就完成了I2C的初始化,今天就学习到这里,下一章我们学习,怎么写入一个字节的数据到AT24C02中去。

原创文章,作者:小峰,如若转载,请注明出处:http://www.wfblog.com/archives/184.html

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息