完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
I2C总线
1. 简介 1.1 I2C总线介绍 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速I2C总线一般可达400kbps以上。下面从物理层和协议层两方面来了解I2C
1.2 AT24C02芯片介绍 AT24C02是一个2K位串行CMOS,内部含有256个字节,此芯片具有I2C通讯接口,芯片内保存的数据在掉电的情况下不丢失(EEPROM),常用于存放比较重要的数据。本实验使用的是SOP-8封装的AT24C02芯片,其引脚说明见下图 AT24C02芯片的器件地址为7位,高4位固定为1010,低3位有上表中的A0/A1/A2引脚的电平决定,还有一位(最低位R/W)用来选择读写方向。本实验中A0/A1/A2引脚接在GND上了,因此器件地址为1010000;加上最低位的读写方向位后,写器件地址为10100000(0xA0),读器件地址为10100001(0xA1) 下图为AT24C02的总线时序图和时间参数 2. 硬件设计 D1指示灯用来提示系统运行状态,K_UP按键用来控制24C02的数据写入,K_DOWN按键用来控制24C02的数据读取,数据的写入与读取信息通过串口1打印出来
3. 软件设计 3.1 STM32CubeMX设置
void MX_I2C2_Init(void){ hi2c2.Instance = I2C2; hi2c2.Init.ClockSpeed = 100000; hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c2.Init.OwnAddress1 = 0; hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c2.Init.OwnAddress2 = 0; hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c2) != HAL_OK){ Error_Handler(); } } void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle){ GPIO_InitTypeDef GPIO_InitStruct = {0}; if(i2cHandle->Instance==I2C2){ __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2C2 GPIO Configuration PB10 ------> I2C2_SCL PB11 ------> I2C2_SDA*/ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* I2C2 clock enable */ __HAL_RCC_I2C2_CLK_ENABLE(); //网上看到很多资料说此处的I2C时钟初始化函数应该放在GPIO初始化之前,但是这里没有调整也能够正常读写EEPROM } } 创建按键驱动文件key.c 和相关头文件key.h(驱动代码参考按键输入实验) 添加AT24C02驱动文件24cxx.c和24cxx.h #define ADDR_24CXX_WRITE 0XA0 #define ADDR_24CXX_READ 0XA1 void AT24CXX_Init(void){ MX_I2C2_Init(); while(AT24CXX_Check()){ printf("AT24C02 Checked Failed!rn"); HAL_Delay(500); } printf("AT24C02 Checked Sucessed!rn"); } uint8_t AT24CXX_Check(void){ uint8_t temp; HAL_I2C_Mem_Read(&hi2c2,ADDR_24CXX_READ,255,I2C_MEMADD_SIZE_8BIT,&temp,1,0xff); if(temp==0x36) return 0; else{ uint8_t data = 0x36; HAL_I2C_Mem_Write(&hi2c2,ADDR_24CXX_WRITE,255,I2C_MEMADD_SIZE_8BIT,&data,1,0xff); HAL_I2C_Mem_Read(&hi2c2,ADDR_24CXX_READ,255,I2C_MEMADD_SIZE_8BIT,&temp,1,0xff); if(temp==0x36) return 0; } return 1; } 在main.c文件下编写IIC测试代码 AT24C02的2Kbit分为32页,每页8个字节。而EEPROM也可以按页写入,本例使用了按页写入的方式,分32次写入。注意每次写入完毕需要延时5ms,是AT24C02芯片的要求;读取数据没有页的限制,可以一次全部读取256个字节 /* USER CODE BEGIN PV */ #define ADDR_24CXX_WRITE 0XA0 #define ADDR_24CXX_READ 0XA1 uint8_t WriteBuf[256]; uint8_t ReadBuf[256]; uint16_t i,j; /* USER CODE END PV */ void SystemClock_Config(void); int main(void){ uint8_t key; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C2_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ AT24CXX_Init(void); printf("rn*********STM32CubeMX I2C AT24C02 Example*********rn"); for(i = 0;i < 256; i++){ //初始化写数据缓冲区 WriteBuf = i; } /* USER CODE END 2 */ while (1){ key = KEY_Scan(0); if(key == KEY_UP_PRES){ for(j = 0;j < 32;j++){ //按页写入EEPROM,分32次写入 if(HAL_I2C_Mem_Write(&hi2c2,ADDR_24CXX_WRITE,8*j,I2C_MEMADD_SIZE_8BIT,WriteBuf+8*j,8,0xFF) == HAL_OK){ printf("rnEEPROM 24C02 Write Test OK!rn"); HAL_Delay(5); } else{ printf("rnEEPROM 24C02 Write Test False!rn"); HAL_Delay(5); } } } if(key == KEY_DOWN_PRES){ //EEPROM读取没有页限制,可以一次读取256个字节 HAL_I2C_Mem_Read(&hi2c2,ADDR_24CXX_READ,0,I2C_MEMADD_SIZE_8BIT,ReadBuf,256,0xFF); for(i=0;i<256;i++){ printf("0x%02X ",ReadBuf); } if(memcmp(WriteBuf,ReadBuf,256) == 0){ //通过内存比较,判断读取和写入的数据是否相同 printf("rnEEPROM 24C02 Read Test OK!rn"); } else{ printf("rnEEPROM 24C02 Read Test False!rn"); } } HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); HAL_Delay(500); } } 4. 下载验证 编译无误下载到开发板后,可以看到D1指示灯不断闪烁,当按下K_UP按键后数据写入到24C02芯片内,当按下K_DOWN按键后读取24C02芯片的值,同时串口打印出相应信息 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1561 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1501 浏览 1 评论
933 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
665 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1555 浏览 2 评论
1850浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
615浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
506浏览 3评论
510浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
491浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-11 02:12 , Processed in 0.810123 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号