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

2019-07-14 18:00发布

我正在使用STM32f030c8在24c04开发用于I2C eeprom的库。我的读写功能有效,但是当我在写入eeprom后立即尝试读取时,eeprom doest会返回任何数据。但是我可以马上连续写一下。只有在写入语句后才能读取问题。我尝试启用和禁用I2C使能位,但问题仍然存在。有人可以告诉我这是什么问题吗
  1. void main()
  2. {
  3.    Configure_GPIO_I2C2();
  4.    Configure_I2C2_Master(0xA0,1);

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

  9. }

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

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

  16.                 //I2C2_StartWrite(1);

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

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

  21.             }

  22.             uint8_t I2C_ReadByte(uint8_t byteToRead)
  23.             {
  24.                 I2C2->ISR=0x01;
  25.                 I2C2_StartWrite(1);

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

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


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

  34.                 return recv_data;

  35.             }

  36.             void Configure_GPIO_I2C2(void)
  37.             {

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

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

  43.                 GPIOF->PUPDR &= ~(1<<12);
  44.                 GPIOF->PUPDR &= ~(1<<12);
  45.             }

  46.         void Configure_I2C2_Master(uint8_t slave_addr,uint8_t no_of_bytes)
  47.             {

  48.                 RCC->APB1ENR |= RCC_APB1ENR_I2C2EN;

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

  59.     void I2C2_StartWrite(int bytesToWrite)
  60.             {

  61.                 I2C2->CR2 &= ~I2C_CR2_RD_WRN;

  62.                 I2C2->CR2 |= bytesToWrite<<16;

  63.                 I2C2->CR2 |= I2C_CR2_START;
  64.                 while(I2C2->CR2 & I2C_CR2_START);
  65.             }

  66.             void I2C2_StartRead(int bytesToRead)
  67.             {
  68.             I2C2->CR2 |= I2C_CR2_RD_WRN;

  69.                 I2C2->CR2 |= bytesToRead<<16;

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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。