if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
{ HAL_Delay(500);
testarr[0]+=3;
if(HAL_I2C_Mem_Write(&hi2c1,0xa0,60,I2C_MEMADD_SIZE_8BIT,&testarr[0],1,3000)==HAL_OK)
{
printf (" testarr[0]=%drn",testarr[0]);
printf ("write OK !!!rn");
HAL_Delay(5);
}
else
printf ("write false !!!rn");
// HAL_I2C_Mem_Write(&hi2c1,EEPROM_I2C_ADDRESS,60,I2C_MEMADD_SIZE_8BIT,&testarr[1],1,3000);//&hi2c1³öÎÊÌ⣬ÁíÍâÒ²²»ÊÇ0xa1
if( HAL_I2C_Mem_Read(&hi2c1,0xa1,60,I2C_MEMADD_SIZE_8BIT,&testarr[1],1,3000)==HAL_OK)//Ìî0xa1,»òÕß0xa0¶¼¿ÉÒÔ
{
printf ("Read OK !!!rn");
printf (" testarr[1]=%drn",testarr[1]);
}
else
printf ("Read false !!!rn");
}
HAL_Delay(500);
testarr[0]+=3;
if(HAL_I2C_Mem_Write(&hi2c1,0xa0,60,I2C_MEMADD_SIZE_8BIT,&testarr[0],1,3000)==HAL_OK)
{
printf (" testarr[0]=%drn",testarr[0]);
printf ("write OK !!!rn");
HAL_Delay(5);
}
else
printf ("write false !!!rn");
// HAL_I2C_Mem_Write(&hi2c1,EEPROM_I2C_ADDRESS,60,I2C_MEMADD_SIZE_8BIT,&testarr[1],1,3000);//&hi2c1³öÎÊÌ⣬ÁíÍâÒ²²»ÊÇ0xa1
if( HAL_I2C_Mem_Read(&hi2c1,0xa1,60,I2C_MEMADD_SIZE_8BIT,&testarr[1],1,3000)==HAL_OK)//Ìî0xa1,»òÕß0xa0¶¼¿ÉÒÔ
{
printf ("Read OK !!!rn");
printf (" testarr[1]=%drn",testarr[1]);
}
else
printf ("Read false !!!rn");
}
1,这个问题搞了几天了,最后是借鉴硬石科技写的底层EEPROM,自己的一直通不了,很郁闷。
#ifndef __I2C_EEPROM_H__
#define __I2C_EEPROM_H__
/* °üº¬Í·Îļþ ----------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
/* ÀàÐͶ¨Òå ------------------------------------------------------------------*/
/* ºê¶¨Òå --------------------------------------------------------------------*/
#define I2C_OWN_ADDRESS 0x0A // stm32±¾»úI2CµØÖ·
#define I2C_SPEEDCLOCK 400000 // I2CͨÐÅËÙÂÊ(×î´óΪ400K)
#define I2C_DUTYCYCLE I2C_DUTYCYCLE_2 // I2CÕ¼¿Õ±Èģʽ£º1/2
#define EEPROM_I2Cx I2C1
#define EEPROM_I2C_RCC_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE()
#define EEPROM_I2C_RCC_CLK_DISABLE() __HAL_RCC_I2C1_CLK_DISABLE()
#define EEPROM_I2C_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define EEPROM_I2C_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
#define EEPROM_I2C_GPIO_PORT GPIOB
#define EEPROM_I2C_SCL_PIN GPIO_PIN_6
#define EEPROM_I2C_SDA_PIN GPIO_PIN_7
/*
* EEPROM 2kb = 2048bit = 2048/8 B = 256 B
* 32 pages of 8 bytes each
*
* Device Address
* 1 0 1 0 A2 A1 A0 R/W
* 1 0 1 0 0 0 0 0 = 0XA0
* 1 0 1 0 0 0 0 1 = 0XA1
*/
/* EEPROM Addresses defines */
#define EEPROM_I2C_ADDRESS 0xA0
/* À©Õ¹±äÁ¿ ------------------------------------------------------------------*/
extern I2C_HandleTypeDef hi2c_eeprom;
/* º¯ÊýÉùÃ÷ ------------------------------------------------------------------*/
void MX_I2C_EEPROM_Init(void);
void I2C_EEPROM_WriteData(uint16_t Addr, uint8_t Reg, uint8_t Value);
HAL_StatusTypeDef I2C_EEPROM_WriteBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
HAL_StatusTypeDef I2C_EEPROM_WriteAnyLength(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
uint8_t I2C_EEPROM_ReadData(uint16_t Addr, uint8_t Reg);
HAL_StatusTypeDef I2C_EEPROM_ReadBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
HAL_StatusTypeDef I2C_EEPROM_IsDeviceReady(uint16_t DevAddress, uint32_t Trials);
#endif /* __I2C_EEPROM_H__ */
/******************* (C) COPYRIGHT 2015-2020 ӲʯǶÈëʽ¿ª·¢ÍÅ¶Ó *****END OF FILE****/
/**
******************************************************************************
* ÎļþÃû³Ì: bsp_EEPROM.c
* ×÷ Õß: ӲʯǶÈëʽ¿ª·¢ÍŶÓ
* °æ ±¾: V1.0
* ±àдÈÕÆÚ: 2015-10-04
* ¹¦ ÄÜ: °åÔØEEPROM£¨AT24C02£©µ×²ãÇý¶¯³ÌÐò
******************************************************************************
* ˵Ã÷£º
* ±¾Àý³ÌÅäÌ×Ӳʯstm32¿ª·¢°åYS-F1ProʹÓá£
*
* ÌÔ±¦£º
* ÂÛ̳£ºhttp://www.ing10bbs.com
* °æȨ¹éӲʯǶÈëʽ¿ª·¢ÍŶÓËùÓУ¬ÇëÎðÉÌÓá£
******************************************************************************
*/
/* °üº¬Í·Îļþ ----------------------------------------------------------------*/
#include "bsp_EEPROM.h"
/* ˽ÓÐÀàÐͶ¨Òå --------------------------------------------------------------*/
/* ˽Óк궨Òå ----------------------------------------------------------------*/
#define EVAL_I2Cx_TIMEOUT_MAX 3000
/* ˽ÓбäÁ¿ ------------------------------------------------------------------*/
I2C_HandleTypeDef hi2c_eeprom;
uint32_t I2cxTimeout = EVAL_I2Cx_TIMEOUT_MAX;
/* À©Õ¹±äÁ¿ ------------------------------------------------------------------*/
/* ˽Óк¯ÊýÔÐÎ --------------------------------------------------------------*/
/* º¯ÊýÌå --------------------------------------------------------------------*/
/**
* º¯Êý¹¦ÄÜ: I2CÍâÉè³õʼ»¯
* ÊäÈë²ÎÊý: ÎÞ
* ·µ »Ø Öµ: ÎÞ
* ˵ Ã÷£ºÎÞ
*/
void MX_I2C_EEPROM_Init(void)
{
hi2c_eeprom.Instance = EEPROM_I2Cx;
hi2c_eeprom.Init.ClockSpeed = I2C_SPEEDCLOCK;
hi2c_eeprom.Init.DutyCycle = I2C_DUTYCYCLE;
hi2c_eeprom.Init.OwnAddress1 = 0;
hi2c_eeprom.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c_eeprom.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c_eeprom.Init.OwnAddress2 = 0;
hi2c_eeprom.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c_eeprom.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c_eeprom);
}
/**
* º¯Êý¹¦ÄÜ: I2CÍâÉèÓ²¼þ³õʼ»¯ÅäÖÃ
* ÊäÈë²ÎÊý: hi2c£ºI2C¾ä±úÀàÐÍÖ¸Õë
* ·µ »Ø Öµ: ÎÞ
* ˵ Ã÷: ¸Ãº¯Êý±»HAL¿âÄÚ²¿µ÷ÓÃ
*/
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==EEPROM_I2Cx)
{
/* ʹÄÜÍâÉèʱÖÓ */
EEPROM_I2C_RCC_CLK_ENABLE();
EEPROM_I2C_GPIO_CLK_ENABLE();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = EEPROM_I2C_SCL_PIN|EEPROM_I2C_SDA_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(EEPROM_I2C_GPIO_PORT, &GPIO_InitStruct);
}
}
/**
* º¯Êý¹¦ÄÜ: I2CÍâÉèÓ²¼þ·´³õʼ»¯ÅäÖÃ
* ÊäÈë²ÎÊý: hi2c£ºI2C¾ä±úÀàÐÍÖ¸Õë
* ·µ »Ø Öµ: ÎÞ
* ˵ Ã÷: ¸Ãº¯Êý±»HAL¿âÄÚ²¿µ÷ÓÃ
*/
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{
if(hi2c->Instance==EEPROM_I2Cx)
{
/* ½ûÓÃÍâÉèʱÖÓ */
EEPROM_I2C_GPIO_CLK_DISABLE();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
HAL_GPIO_DeInit(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN|EEPROM_I2C_SDA_PIN);
}
}
/**
* º¯Êý¹¦ÄÜ: I2CͨÐÅ´íÎó´¦Àíº¯Êý
* ÊäÈë²ÎÊý: ÎÞ
* ·µ »Ø Öµ: ÎÞ
* ˵ Ã÷: Ò»°ãÔÚI2CͨÐų¬Ê±Ê±µ÷Óøú¯Êý
*/
static void I2C_EEPROM_Error (void)
{
/* ·´³õʼ»¯I2CͨÐÅ×ÜÏß */
HAL_I2C_DeInit(&hi2c_eeprom);
/* ÖØгõʼ»¯I2CͨÐÅ×ÜÏß*/
MX_I2C_
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』