-
I2C介绍
I2C总线这部分网络上资料齐全,我这里就不多说了。在这里我主要介绍下,学习通信EEPROM相关需要知道的地方。首先,需要准备以下资料:
- AT24C02的数据手册;
- STM32F10x中文参考手册;
- STM32F10x固件库手册;
以上资料相关部分最好是看过的,主要是AT24C02数据手册一定要看明白,中文手册看一下I2C部分,在24章节开始。库函数打开Modules-STM32F10x_StdPeriph_Driver-I2C这里目录下。
看完AT24C02手册我们需要大概知道:
- I2C总线支持400kHz;
- 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地址的由来。
- AT24C02 大小为2K,内部含有32个页面,每一个页面包含了8个字节。
看完STM32F10x中文参考手册和库文件手册我们需要大概知道:
- STM32的I2C总线支持100kHz和400kHz速率
- STM32的I2C 两个引脚需要配置成开漏复用输出模式,在手册8.1.11章节有介绍。
- 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