打印
[STM32F0]

STM32f030C8 I2C EEPROM - 写入后读取时不接收数据

[复制链接]
233|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2024-2-26 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我正在使用STM32f030c8在24c04开发用于I2C eeprom的库。我的读写功能有效,但是当我在写入eeprom后立即尝试读取时,eeprom doest会返回任何数据。但是我可以马上连续写一下。只有在写入语句后才能读取问题。我尝试启用和禁用I2C使能位,但问题仍然存在。有人可以告诉我这是什么问题吗


void main()
{
   Configure_GPIO_I2C2();
   Configure_I2C2_Master(0xA0,1);

    I2C_WriteByte(5,'k');
    charr= I2C_ReadByte(5);//the program get stuck here because no byte is
                            //received from eeprom
    UART_Send_String(1,&charr);

}

void I2C_WriteByte(uint8_t addr,uint8_t bytetowrite)
            {
                I2C2->ISR=0x01;
                I2C2_StartWrite(2);//start

                I2C2->TXDR = addr;//write addr
                while(!(I2C2->ISR & I2C_ISR_TXE));

                //I2C2_StartWrite(1);

                I2C2->TXDR = bytetowrite;
                while(!(I2C2->ISR & I2C_ISR_TXE));

                I2C2->CR2 |= I2C_CR2_STOP;//stop
                while(I2C2->CR2 & I2C_CR2_STOP);

            }

            uint8_t I2C_ReadByte(uint8_t byteToRead)
            {
                I2C2->ISR=0x01;
                I2C2_StartWrite(1);

                I2C2->TXDR = byteToRead;
                while(!(I2C2->ISR & I2C_ISR_TXE));

                I2C2_StartRead(1);  
                while(!(I2C2->ISR & I2C_ISR_RXNE));
                UART_Send_String(1,"r strt");
                uint8_t recv_data=I2C2->RXDR;   


                I2C2->CR2 |= I2C_CR2_STOP;
                while(I2C2->CR2 & I2C_CR2_STOP);

                return recv_data;

            }

            void Configure_GPIO_I2C2(void)
            {

                RCC->AHBENR |= RCC_AHBENR_GPIOFEN;  
                GPIOF->MODER |= (2<<12) | (2<<14);  
                GPIOF->OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7;

                GPIOF->OSPEEDR &=  ~(1<<12);
                GPIOF->OSPEEDR &=  ~(1<<14);

                GPIOF->PUPDR &= ~(1<<12);
                GPIOF->PUPDR &= ~(1<<12);
            }

        void Configure_I2C2_Master(uint8_t slave_addr,uint8_t no_of_bytes)
            {

                RCC->APB1ENR |= RCC_APB1ENR_I2C2EN;

                /* (1) timing register value is computed with the AN4235 xls file,
                 fast Mode @400kHz with I2CCLK = 48MHz, rise time = 140ns, fall time = 40ns */  
                I2C2->CR1 &= ~I2C_CR1_PE;
                I2C2->TIMINGR |= (uint32_t)0x00B01A4B; /* (1) */
                I2C2->CR2 |= (uint8_t)slave_addr;
                I2C2->CR2 |= no_of_bytes<<16;   
                I2C2->CR1 |= I2C_CR1_PE;
                //NVIC_SetPriority(I2C2_IRQn, 0); /* (7) */
                //NVIC_EnableIRQ(I2C2_IRQn); /* (8) */
            }

    void I2C2_StartWrite(int bytesToWrite)
            {

                I2C2->CR2 &= ~I2C_CR2_RD_WRN;

                I2C2->CR2 |= bytesToWrite<<16;

                I2C2->CR2 |= I2C_CR2_START;
                while(I2C2->CR2 & I2C_CR2_START);
            }

            void I2C2_StartRead(int bytesToRead)
            {
            I2C2->CR2 |= I2C_CR2_RD_WRN;

                I2C2->CR2 |= bytesToRead<<16;

                I2C2->CR2 |= I2C_CR2_START;
                while(I2C2->CR2 & I2C_CR2_START);
            }
复制代码

使用特权

评论回复
沙发
liu96jp| | 2024-2-29 22:38 | 只看该作者
接收不到数据?是不是读的状态你没有给配置啊?

使用特权

评论回复
板凳
g0d5xs| | 2024-2-29 22:59 | 只看该作者
对eeprom的话,一般是有读状态和写状态,你写完配置成读就好了

使用特权

评论回复
地板
Charlene沙| | 2024-2-29 23:15 | 只看该作者
咱说,这个可能是时序不对,容易出现你这种情况的

使用特权

评论回复
5
b5z1giu| | 2024-2-29 23:45 | 只看该作者
为啥读不到,用逻辑分析仪抓一下?

使用特权

评论回复
6
呐咯密密| | 2024-3-5 14:05 | 只看该作者
你是没写完就读?是这个意思吗

使用特权

评论回复
7
海滨消消| | 2024-3-7 10:59 | 只看该作者
检查EEPROM的写周期,并在写入后添加适当的延时

使用特权

评论回复
8
豌豆爹| | 2024-3-8 12:15 | 只看该作者
检查I2C的配置是否正确,包括时钟速度、地址格式等。

使用特权

评论回复
9
白马过平川| | 2024-3-15 14:10 | 只看该作者
接收的时序不对?也许是这样

使用特权

评论回复
10
捧一束彼岸花| | 2024-3-15 17:00 | 只看该作者
可能的原因是在写入数据到EEPROM后,可能需要一些时间来完成写入操作

使用特权

评论回复
11
月亮一键变蓝| | 2024-3-15 19:00 | 只看该作者
在进行读取操作之前,需要确保写入操作已经完成

使用特权

评论回复
12
未说出口的像你| | 2024-3-15 21:00 | 只看该作者
还需要检查I2C通信的时序和地址设置是否正确,以及确认写入和读取的数据格式是否匹配

使用特权

评论回复
13
将爱藏于深海| | 2024-3-15 23:00 | 只看该作者
需要确保STM32的I2C外设配置正确,包括时钟频率、ACK使能等设置

使用特权

评论回复
14
一只眠羊| | 2024-3-16 03:00 | 只看该作者
我觉得可能是程序逻辑问题吧

使用特权

评论回复
15
失物招領| | 2024-3-16 05:00 | 只看该作者
其实是这样,你写完之后,要等几个周期再去读,也许是OK的

使用特权

评论回复
16
西洲| | 2024-3-16 07:00 | 只看该作者
这个I2C时序你确认是对的?逻辑分析仪分析一下数据看看吧

使用特权

评论回复
17
在曼谷的春| | 2024-3-16 14:00 | 只看该作者
我觉得可能是你写的数据不对?导致芯片锁死了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1197

主题

3037

帖子

0

粉丝