新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2020-8-4
- 在线时间
- 6 小时
|
10金钱
本帖最后由 hss123 于 2020-11-4 16:43 编辑
用IIC读写EEPROM,不知道是没写进去,还是什么原因,每次读到的都是0xFF,用逻辑分析仪看时序好像也没有什么问题,eeprom没有写保护(WP低电平)
代码如下:
/** ****************************************************************************
* @brief 初始化I2C的gpio SCL SDA复用引脚配置
* @param hi2c I2C结构体指针
* @return GPIO初始化结果
*******************************************************************************/
static int I2cGpioInit(I2C_Device *i2c)
{
if(I2C1 == i2c->i2cx)
{
GpioInit2AfOd(IIC1_SCL, GPIO_AF_PP_PULLUP);
GpioInit2AfOd(IIC1_SDA, GPIO_AF_PP_PULLUP);
// __HAL_RCC_I2C1_FORCE_RESET();
// __HAL_RCC_I2C1_RELEASE_RESET();
}
else if(I2C2 == i2c->i2cx)
{
GpioInit2AfOd(IIC2_SCL, GPIO_AF_PP_PULLUP); //开漏
GpioInit2AfOd(IIC2_SDA, GPIO_AF_PP_PULLUP);
// __HAL_RCC_I2C2_FORCE_RESET();
// __HAL_RCC_I2C2_RELEASE_RESET();
}
else
{
I2C_DEBUG("I2C prot not define!");
return I2C_NULL;
}
return I2C_OK;
}
/** ****************************************************************************
* @brief I2C工作模式配置
* @param i2c I2C结构体指针
* @return 配置结果
*******************************************************************************/
static int32_t I2cModeCfg(I2C_Device *i2c)
{
i2c->hi2c.Instance = i2c->i2cx;
i2c->hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
i2c->hi2c.Init.ClockSpeed = 100000;
i2c->hi2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
i2c->hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2;
i2c->hi2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
i2c->hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
i2c->hi2c.Init.OwnAddress1 = 0x0A ;
i2c->hi2c.Init.OwnAddress2 = 0;
if(HAL_I2C_Init(&i2c->hi2c) != HAL_OK) //初始化I2C
{
SPI_DEBUG("I2C init error!");
return I2C_ERROR_INIT;
}
return I2C_OK;
}
/** ****************************************************************************
* @brief IIC初始化
* @param i2c I2C结构体指针
* @param i2cx: 取值I2C1/I2C2
* @return 初始化结果
*******************************************************************************/
int32_t I2cInit(I2C_Device *i2c, I2C_TypeDef* i2cx)
{
i2c->i2cx = i2cx;
I2cGpioInit(i2c);
if(I2C1 == i2c->i2cx)
{
__HAL_RCC_I2C1_CLK_ENABLE();
}
else if(I2C2 == i2c->i2cx)
{
__HAL_RCC_I2C2_CLK_ENABLE();
}
else
{
I2C_DEBUG("I2C prot not define!");
return I2C_NULL;
}
I2cModeCfg(i2c);
return I2C_OK;
}
/** ****************************************************************************
* @brief IIC写数据到EEPROM
* @param buf 写入数据buffer指针
* @param addr 写地址
* @param num 写的字节数
* @return 写状态
*******************************************************************************/
uint32_t I2cWrite(I2C_Device* i2c, uint8_t* buf, uint16_t addr, uint16_t num)
{
HAL_StatusTypeDef status = HAL_OK;
status = HAL_I2C_Mem_Write(&i2c->hi2c, ((EEPROM_W_ADDRESS & 0x14) | 0xA0), addr, I2C_MEMADD_SIZE_8BIT, buf, num, 100);
/* Check the communication status */
if(status != HAL_OK)
{
/* Execute user timeout callback */
//I2Cx_Error(Addr);
}
while (HAL_I2C_GetState(&i2c->hi2c) != HAL_I2C_STATE_READY)
{
}
/* Check if the EEPROM is ready for a new operation */
while (HAL_I2C_IsDeviceReady(&(i2c->hi2c), ((EEPROM_W_ADDRESS & 0x14) | 0xA0), EEPROM_MAX_TRIALS, I2Cx_TIMEOUT_MAX) == HAL_TIMEOUT);
/* Wait for the end of the transfer */
while (HAL_I2C_GetState(&i2c->hi2c) != HAL_I2C_STATE_READY)
{
}
return status;
}
/** ****************************************************************************
* @brief IIC读EEPROM数据
* @param buf 存放数据buffer指针
* @param addr 读地址
* @param num 读的字节数
* @return 读状态
*******************************************************************************/
int32_t I2cRead(I2C_Device *i2c, uint8_t* buf, uint16_t addr, uint16_t num)
{
if(HAL_I2C_Mem_Read(&i2c->hi2c, ((EEPROM_W_ADDRESS & 0x14) | 0xA0), addr, I2C_MEMADD_SIZE_8BIT, buf, num, 100) != HAL_OK)
{
return I2C_ERR;
}
else
{
return I2C_OK;
}
}
// 测试函数
I2C_Device i2c;
#define DATA_Size 256
#define EEP_Firstpage 0x10
uint8_t Write[DATA_Size];
uint8_t Read[DATA_Size];
int8_t I2cTest(void* argc,void*argv[])
{
int i = shellExtParsePara(&UartShell,argv[1]);
int j = shellExtParsePara(&UartShell,argv[2]);
if(i == 1)
{
I2cInit(&i2c, I2C1);
}
else
{
I2cInit(&i2c, I2C2);
}
// for(int16_t i=0; i<DATA_Size; i++ )
// {
// Write =i+1;
// // printf("0x%02X ", Write);
// // if(i%16 == 15)
// // printf("\n\r");
// }
Write[0] = 5;
if((j == 1) || (j == 3))
{
I2cWrite(&i2c, Write, EEP_Firstpage, 1);
}
// I2C_EE_BufferWrite(&i2c, Write, EEP_Firstpage, DATA_Size);
delay_ms(10);
if((j == 2 ) || (j == 3))
{
I2cRead(&i2c, Read, EEP_Firstpage, 1);
}
for (int16_t i=0; i<DATA_Size; i++)
{
if(Read[i] != Write[i])
{
printf("eeprom error\r\n");
printf("0x%02X ", Read[i]);
return 0;
}
printf("0x%02X ", Read[i]);
if(i%16 == 15)
printf("\n\r");
}
}
SHELL_EXPORT_CMD(i2ctest, I2cTest, I2cTest);
#define EEPROM_W_ADDRESS 0xA0
#define EEPROM_R_ADDRESS 0xA1
再放两张逻辑分析仪的时序
[img]file:///C:\Users\acer\Documents\Tencent Files\787820739\Image\Group2\U}\0%\U}0%G8GZ~9332UGW[06_UF5.png[/img]file:///C:\Users\acer\Documents\Tencent Files\787820739\Image\Group2\B3\~X\B3~X98U3FFER]9HSF5A6~FW.png
|
-
-
|