Leal� 2021-01-24 20:34 采纳率: 100%
浏览 205
已采纳

-EEPROM, 基于stm32f429, 读取的数据都为0

 

问题:通过IIC往EEPROM中写入一个数据 ,但是从该地址读取的数据总为0.
代码如下:
static void I2C_GPIO_Config(void)
{
        GPIO_InitTypeDef I2C_GPIO_InitStruct;
       
        RCC_AHB1PeriphClockCmd(I2C_SCL_CLK|I2C_SDA_CLK, ENABLE);
        GPIO_PinAFConfig(I2C_SDA_PORT, I2C_SDA_PINSOURCE, GPIO_AF_I2C1);
        GPIO_PinAFConfig(I2C_SCL_PORT, I2C_SCL_PINSOURCE, GPIO_AF_I2C1);
       
        I2C_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        I2C_GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;   /*经测试必须是OD输出,而不能是PP输出*/
        I2C_GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        I2C_GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        I2C_GPIO_InitStruct.GPIO_Pin = I2C_SCL_PIN;
        GPIO_Init(I2C_SCL_PORT, &I2C_GPIO_InitStruct);
       
       
       
        I2C_GPIO_InitStruct.GPIO_Pin = I2C_SDA_PIN;
        GPIO_Init(I2C_SDA_PORT, &I2C_GPIO_InitStruct);
       
}

void I2C_Config(void)
{
        I2C_GPIO_Config();
        RCC_APB1PeriphClockCmd(I2C_CLK, ENABLE);
       
        I2C_InitTypeDef I2C_InitStruct;
        I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStruct.I2C_ClockSpeed  = 400000;
        I2C_InitStruct.I2C_Ack = I2C_Ack_Enable ;
        I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStruct.I2C_OwnAddress1 = 0xA0;
        I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
       
        I2C_Init(I2C1, &I2C_InitStruct);
        I2C_Cmd (I2C1, ENABLE);
}


static uint32_t ErrorCallback(u8 error_code)
{
        printf("\r\nerror code:%hhd\n\r", error_code);
        return 1;
}

/*
@brief: 写入一个字节
@para1: 指向1个字节数据源的指针
@retval: 状态值,0表示正常

*/

uint8_t I2C_SendByte(uint8_t* pBuffer, uint8_t Addr_of_EE)
{
        ////////////////////
        I2C_GenerateSTART(I2C, ENABLE);
       
        uint32_t timer = TIMEOUT;
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_MODE_SELECT))
        {
                timer--;
                if(timer == 0)  ErrorCallback(1);
        }
       
        ////////////////////
        I2C_Send7bitAddress(I2C, EEPROM_ADDR, I2C_Direction_Transmitter);
        timer = TIMEOUT;
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
        {
                timer--;
                if(timer == 0 ) ErrorCallback(2);
        }
       
        ////////////////////////
        I2C_SendData(I2C, Addr_of_EE);
        timer = TIMEOUT;
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
        {
                timer--;
                if(timer == 0 ) ErrorCallback(3);
        }
       
        I2C_SendData(I2C, *pBuffer);
        timer = TIMEOUT;
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
        {
                timer--;
                if(timer == 0 ) ErrorCallback(4);
        }
       
       
        I2C_GenerateSTOP(I2C, ENABLE);
        return 0;
       
}


/*
@brief: 读取字节
@
@retval:

*/

uint8_t I2C_EE_Read(uint8_t* pDstBuffer, uint8_t Addr_of_EE, uint16_t size)
{
        Wait_EE_Ready();
       
        I2C_GenerateSTART(I2C, ENABLE);
        uint32_t timer = TIMEOUT;
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_MODE_SELECT))
        {
                timer--;
                if(timer == 0)  ErrorCallback(9);
        }
       
        I2C_Send7bitAddress(I2C, EEPROM_ADDR, I2C_Direction_Transmitter);
        timer = TIMEOUT;
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
        {
                timer--;
                if(timer == 0) ErrorCallback(10);
        }
       
       
       
        I2C_SendData(I2C, Addr_of_EE);
        timer = TIMEOUT;
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
        {
                if(timer-- == 0 ) ErrorCallback(11);
        }
       
        Wait_EE_Ready();
        I2C_GenerateSTART(I2C, ENABLE);
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_MODE_SELECT))
        {
                timer--;
                if(timer == 0)  ErrorCallback(12);
        }
       
        I2C_Send7bitAddress(I2C, EEPROM_ADDR, I2C_Direction_Receiver);
        timer =TIMEOUT;
        while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
        {
                if(timer-- == 0) ErrorCallback(13);
        }
       
       
        I2C_AcknowledgeConfig(I2C, ENABLE);
        while(size)
        {
                if(size == 1)
                {
                        I2C_AcknowledgeConfig(I2C, DISABLE);
                        I2C_GenerateSTOP(I2C, ENABLE);
                }
                timer =TIMEOUT;
                while(!I2C_CheckEvent(I2C, I2C_EVENT_MASTER_BYTE_RECEIVED))
                {
                        if(timer-- == 0) ErrorCallback(14);
                }
                *pDstBuffer = I2C_ReceiveData(I2C);
                pDstBuffer++;
                size--;
               
        }
       
       
        I2C_AcknowledgeConfig(I2C, ENABLE);
       
        return 0;
}
 

 

//main.c

int main(void){
    
    Usart_Config();
    I2C_Config();
    GPIO_LED_CONFIG();
    
    printf("测试一下I2C写/读EEPROM,通过串口输出\n");

    
    uint8_t data[2]= {0xFF,0xAB};
    uint8_t stat;
    uint8_t* pDstBuffer;
    
    stat = I2C_SendByte(data, 0x00);
    printf("%d\n", stat);
    stat = I2C_EE_Read(pDstBuffer, 0x00, 1); 
    printf("%d\n", stat);
    
    printf("the data @ 0x00 is :%x\n", *pDstBuffer);
    GPIO_LED_RED_ON;
  
    while(1)
    {
    }

}

 求大神帮忙debug

  • 写回答

2条回答 默认 最新

  • 張公㜽 2021-01-28 10:02
    关注

    pDstBuffer没有分配内存,也没有初始化是个野指针.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 C# 调用Bartender打印机打印
  • ¥100 华为ensp只要2-9实验运行结果能做的来加我QQ
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。
  • ¥15 已知隐函数其中一个变量τ的具体值,求另一个变量
  • ¥15 r语言Hurst指数
  • ¥15 Acrn IVSHMEM doorbell问题
  • ¥15 yolov5中的val测试集训练时数量变小问题
  • ¥15 MPLS/VPN实验中MPLS的配置问题