你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

楼主: lkl0305

[STM32F030] 【STM32F030开发日志/评测/笔记】+(2)STM32F0处理器I2C实例(...

  [复制链接]

31

主题

393

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-28
发表于 2015-10-12 18:08:24 | 显示全部楼层
lkl0305 发表于 2015-10-12 17:39
测试通过的,不过这个很早了,用的是标准库。现在可以用cube库

你有做过stm32f030的i2c读写eeprom的吗?现在正做这一块,调试中有点问题,可否请你指导一下!谢谢!
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
 楼主| 发表于 2015-10-12 20:40:47 | 显示全部楼层
alisa123 发表于 2015-10-12 18:08
你有做过stm32f030的i2c读写eeprom的吗?现在正做这一块,调试中有点问题,可否请你指导一下!谢谢!
...

你用的什么库做的,有什么问题?
手头有逻辑分析仪没,这个调起来很方便
还有CUBE库里有例程,而且函数封装的很完整,建议可以看看
回复 支持 反对

使用道具 举报

31

主题

393

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-28
发表于 2015-10-12 22:01:48 来自手机 | 显示全部楼层
我用的也是标准库,cube库之前一直没用过,好看明白吗?我还没调试成功,我明早吧代码上传,请你帮我看看好吗?
回复 支持 反对

使用道具 举报

31

主题

393

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-28
发表于 2015-10-13 10:08:46 | 显示全部楼层
alisa123 发表于 2015-10-12 22:01
我用的也是标准库,cube库之前一直没用过,好看明白吗?我还没调试成功,我明早吧代码上传,请你帮我看看好 ...

我的i2c配置程序如下,请楼主帮忙看看那里有问题,谢谢!
void I2C_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStruct;
        I2C_InitTypeDef  I2C_InitStruct;
       
        /* Configure the I2C clock source. The clock is derived from the HSI */
        RCC_I2CCLKConfig(RCC_I2C1CLK_HSI);
        /*Enable GPIOB and I2c1 clock*/
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 , ENABLE);
       
        /*GPIO Configuration*/
        /*Configure I2C1 pins: SCL */
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;       
        GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
        /*Configure sEE_I2C pins: SDA */
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
        GPIO_Init(GPIOB , &GPIO_InitStruct);
       
        /* Connect PXx to I2C_SCL*/
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_1);
        /* Connect PXx to I2C_SDA*/
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_1);
       
        /*I2C configuration*/
        I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStruct.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
        I2C_InitStruct.I2C_DigitalFilter = 0x00;
        I2C_InitStruct.I2C_OwnAddress1 =0x00;
        I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;       
        I2C_InitStruct.I2C_Timing = 0x00210507;       
        I2C_Init(I2C1, &I2C_InitStruct);
        I2C_Cmd(I2C1, ENABLE);                                                                                                                /* I2C Peripheral Enable */
}

INT16U sEEAddress = 0;
INT32U sEETimeout = sEE_LONG_TIMEOUT;
INT16U sEEDataNum;

uint32_t sEE_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t* NumByteToRead)
{  
        uint32_t NumbOfSingle = 0, Count = 0, DataNum = 0, StartCom = 0;
  
        /* Get number of reload cycles */
        Count = (*NumByteToRead) / 255;  
        NumbOfSingle = (*NumByteToRead) % 255;
        /* Configure slave address, nbytes, reload and generate start */
        I2C_TransferHandling(sEE_I2C, sEEAddress, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
  
        /* Wait until TXIS flag is set */
        sEETimeout = sEE_LONG_TIMEOUT;
        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET)
        {
                if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
        }
  
        /* Send memory address */
        I2C_SendData(sEE_I2C, (uint8_t)ReadAddr);
        /* Wait until TC flag is set */
        sEETimeout = sEE_LONG_TIMEOUT;
        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TC) == RESET)
        {
                if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
        }  
        /* If number of Reload cycles is not equal to 0 */
        if (Count != 0)
        {
                /* Starting communication */
                StartCom = 1;
   
                /* Wait until all reload cycles are performed */
                while( Count != 0)
                {
                        /* If a read transfer is performed */
                        if (StartCom == 0)      
                        {
                                /* Wait until TCR flag is set */
                                sEETimeout = sEE_LONG_TIMEOUT;
                                while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TCR) == RESET)
                                {
                                        if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
                                }
                        }      
      
                        /* if remains one read cycle */
                        if ((Count == 1) && (NumbOfSingle == 0))
                        {
                                /* if starting communication */
                                if (StartCom != 0)
                                {
                                        /* Configure slave address, end mode and start condition */
                                        I2C_TransferHandling(sEE_I2C, sEEAddress, 255, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
                                }
                                else
                                {
                                        /* Configure slave address, end mode */
                                        I2C_TransferHandling(sEE_I2C, sEEAddress, 255, I2C_AutoEnd_Mode, I2C_No_StartStop);         
                                }
                        }
                        else
                        {
                                /* if starting communication */
                                if (StartCom != 0)
                                {
                                        /* Configure slave address, end mode and start condition */
                                        I2C_TransferHandling(sEE_I2C, sEEAddress, 255, I2C_Reload_Mode, I2C_Generate_Start_Read);
                                }
                                else
                                {
                                        /* Configure slave address, end mode */
                                        I2C_TransferHandling(sEE_I2C, sEEAddress, 255, I2C_Reload_Mode, I2C_No_StartStop);         
                                }
                        }
      
                        /* Update local variable */
                        StartCom = 0;      
                        DataNum = 0;
      
                        /* Wait until all data are received */
                        while (DataNum != 255)
                        {        
                                /* Wait until RXNE flag is set */
                                sEETimeout = sEE_LONG_TIMEOUT;
                                while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_RXNE) == RESET)
                                {
                                        if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
                                }
        
                                /* Read data from RXDR */
                                pBuffer[DataNum]= I2C_ReceiveData(sEE_I2C);
        
                                /* Update number of received data */
                                DataNum++;
                                (*NumByteToRead)--;
                        }      
                        /* Update Pointer of received buffer */
                        pBuffer += DataNum;  
      
                        /* update number of reload cycle */
                        Count--;
                }
   
                /* If number of single data is not equal to 0 */
                if (NumbOfSingle != 0)
                {            
                        /* Wait until TCR flag is set */
                        sEETimeout = sEE_LONG_TIMEOUT;   
                        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TCR) == RESET)
                        {
                                if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
                        }
      
                        /* Update CR2 : set Nbytes and end mode */
                        I2C_TransferHandling(sEE_I2C, sEEAddress, (uint8_t)(NumbOfSingle), I2C_AutoEnd_Mode, I2C_No_StartStop);
      
                        /* Reset local variable */
                        DataNum = 0;
      
                        /* Wait until all data are received */
                        while (DataNum != NumbOfSingle)
                        {        
                                /* Wait until RXNE flag is set */
                                sEETimeout = sEE_LONG_TIMEOUT;
                                while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_RXNE) == RESET)
                                {
                                        if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
                                }
        
                                /* Read data from RXDR */
                                pBuffer[DataNum]= I2C_ReceiveData(sEE_I2C);
        
                                /* Update number of received data */
                                DataNum++;
                                (*NumByteToRead)--;
                        }
                }
        }
        else
        {
                /* Update CR2 : set Slave Address , set read request, generate Start and set end mode */
                I2C_TransferHandling(sEE_I2C, sEEAddress, (uint32_t)(NumbOfSingle), I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
   
                /* Reset local variable */
                DataNum = 0;
   
                /* Wait until all data are received */
                while (DataNum != NumbOfSingle)
                {
                        /* Wait until RXNE flag is set */
                        sEETimeout = sEE_LONG_TIMEOUT;
                        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_RXNE) == RESET)
                        {
                                if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
                        }
      
                        /* Read data from RXDR */
                        pBuffer[DataNum]= I2C_ReceiveData(sEE_I2C);
      
                        /* Update number of received data */
                        DataNum++;
                        (*NumByteToRead)--;
                }   
        }
        /* Wait until STOPF flag is set */
        sEETimeout = sEE_LONG_TIMEOUT;
        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_STOPF) == RESET)
        {
                if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
        }
  
        /* Clear STOPF flag */
        I2C_ClearFlag(sEE_I2C, I2C_ICR_STOPCF);
  
        /* If all operations OK, return sEE_OK (0) */
        return sEE_OK;
}

/*******************************************************************************
  * @brief  Writes more than one byte to the EEPROM with a single WRITE cycle.
  *
  * @note   The number of bytes (combined to write start address) must not
  *         cross the EEPROM page boundary. This function can only write into
  *         the boundaries of an EEPROM page.
  * @note   This function doesn't check on boundaries condition (in this driver
  *         the function sEE_WriteBuffer() which calls sEE_WritePage() is
  *         responsible of checking on Page boundaries).
  *
  * @param  pBuffer: pointer to the buffer containing the data to be written to
  *         the EEPROM.
  * @param  WriteAddr: EEPROM's internal address to write to.
  * @param  NumByteToWrite: pointer to the variable holding number of bytes to
  *         be written into the EEPROM.
  *
  * @retval sEE_OK (0) if operation is correctly performed, else return value
  *         different from sEE_OK (0) or the timeout user callback.
*******************************************************************************/
uint32_t sEE_WritePage(uint8_t* pBuffer, uint16_t WriteAddr, uint8_t* NumByteToWrite)
{   
        uint32_t DataNum = 0;

        /* Configure slave address, nbytes, reload and generate start */
        I2C_TransferHandling(sEE_I2C, sEEAddress, 1, I2C_Reload_Mode, I2C_Generate_Start_Write);

        /* Wait until TXIS flag is set */
        sEETimeout = sEE_LONG_TIMEOUT;  
        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET)
        {
                if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
        }

        /* Send memory address */
        I2C_SendData(sEE_I2C, (uint8_t)WriteAddr);

        /* Wait until TCR flag is set */
        sEETimeout = sEE_LONG_TIMEOUT;
        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TCR) == RESET)
        {
                if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
        }

        /* Update CR2 : set Slave Address , set write request, generate Start and set end mode */
        I2C_TransferHandling(sEE_I2C, sEEAddress, (uint8_t)(*NumByteToWrite), I2C_AutoEnd_Mode, I2C_No_StartStop);

        while (DataNum != (*NumByteToWrite))
        {      
                /* Wait until TXIS flag is set */
                sEETimeout = sEE_LONG_TIMEOUT;
                while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_TXIS) == RESET)
                {
                        if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
                }  

                /* Write data to TXDR */
                I2C_SendData(sEE_I2C, (uint8_t)(pBuffer[DataNum]));

                /* Update number of transmitted data */
                DataNum++;   
        }  

        /* Wait until STOPF flag is set */
        sEETimeout = sEE_LONG_TIMEOUT;
        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_STOPF) == RESET)
        {
                if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback();
        }   

        /* Clear STOPF flag */
        I2C_ClearFlag(sEE_I2C, I2C_ICR_STOPCF);

        /* If all operations OK, return sEE_OK (0) */
        return sEE_OK;
}

/*******************************************************************************
  * @brief  Writes buffer of data to the I2C EEPROM.
  * @param  pBuffer: pointer to the buffer  containing the data to be written
  *         to the EEPROM.
  * @param  WriteAddr: EEPROM's internal address to write to.
  * @param  NumByteToWrite: number of bytes to write to the EEPROM.
  * @retval None
*******************************************************************************/
void sEE_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite)
{
        uint16_t NumOfPage = 0, NumOfSingle = 0, count = 0;
        uint16_t Addr = 0;
  
        Addr = WriteAddr % sEE_PAGESIZE;
        count = sEE_PAGESIZE - Addr;
        NumOfPage =  NumByteToWrite / sEE_PAGESIZE;
        NumOfSingle = NumByteToWrite % sEE_PAGESIZE;
  
        /*!< If WriteAddr is sEE_PAGESIZE aligned  */
        if(Addr == 0)
        {
                /*!< If NumByteToWrite < sEE_PAGESIZE */
                if(NumOfPage == 0)
                {
                        /* Store the number of data to be written */
                        sEEDataNum = NumOfSingle;
                        /* Start writing data */
                        sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum));
                        sEE_WaitEepromStandbyState();
                }
                /*!< If NumByteToWrite > sEE_PAGESIZE */
                else  
                {
                        while(NumOfPage--)
                        {
                                /* Store the number of data to be written */
                                sEEDataNum = sEE_PAGESIZE;        
                                sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum));
                                sEE_WaitEepromStandbyState();
                                WriteAddr +=  sEE_PAGESIZE;
                                pBuffer += sEE_PAGESIZE;
                        }
                  
                        if(NumOfSingle!=0)
                        {
                                /* Store the number of data to be written */
                                sEEDataNum = NumOfSingle;         
                                sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum));
                                sEE_WaitEepromStandbyState();
                        }
                }
        }
        /*!< If WriteAddr is not sEE_PAGESIZE aligned  */
        else
        {
                /*!< If NumByteToWrite < sEE_PAGESIZE */
                if(NumOfPage== 0)
                {
                        /*!< If the number of data to be written is more than the remaining space
                        in the current page: */
                        if (NumByteToWrite > count)
                        {
                                /* Store the number of data to be written */
                                sEEDataNum = count;        
                                /*!< Write the data conained in same page */
                                sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum));
                                sEE_WaitEepromStandbyState();      

                                /* Store the number of data to be written */
                                sEEDataNum = (NumByteToWrite - count);         
                                /*!< Write the remaining data in the following page */
                                sEE_WritePage((uint8_t*)(pBuffer + count), (WriteAddr + count), (uint8_t*)(&sEEDataNum));
                                sEE_WaitEepromStandbyState();        
                        }      
                        else      
                        {
                                /* Store the number of data to be written */
                                sEEDataNum = NumOfSingle;         
                                sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum));
                                sEE_WaitEepromStandbyState();        
                        }     
                }
                /*!< If NumByteToWrite > sEE_PAGESIZE */
                else
                {
                        NumByteToWrite -= count;
                        NumOfPage =  NumByteToWrite / sEE_PAGESIZE;
                        NumOfSingle = NumByteToWrite % sEE_PAGESIZE;

                        if(count != 0)
                        {  
                                /* Store the number of data to be written */
                                sEEDataNum = count;         
                                sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum));
                                sEE_WaitEepromStandbyState();
                                WriteAddr += count;
                                pBuffer += count;
                        }

                        while(NumOfPage--)
                        {
                                /* Store the number of data to be written */
                                sEEDataNum = sEE_PAGESIZE;         
                                sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum));
                                sEETimeout = sEE_LONG_TIMEOUT;
                                sEE_WaitEepromStandbyState();
                                WriteAddr +=  sEE_PAGESIZE;
                                pBuffer += sEE_PAGESIZE;  
                        }
                        if(NumOfSingle != 0)
                        {
                                /* Store the number of data to be written */
                                sEEDataNum = NumOfSingle;           
                                sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum));
                                sEE_WaitEepromStandbyState();
                        }
                }
        }  
}

/*******************************************************************************
  * @brief  Wait for EEPROM Standby state.
  *
  * @note  This function allows to wait and check that EEPROM has finished the
  *        last operation. It is mostly used after Write operation: after receiving
  *        the buffer to be written, the EEPROM may need additional time to actually
  *        perform the write operation. During this time, it doesn't answer to
  *        I2C packets addressed to it. Once the write operation is complete
  *        the EEPROM responds to its address.
  *
  * @param  None
  *
  * @retval sEE_OK (0) if operation is correctly performed, else return value
  *         different from sEE_OK (0) or the timeout user callback.
*******************************************************************************/
uint32_t sEE_WaitEepromStandbyState(void)      
{
        __IO uint32_t sEETrials = 0;
  
        /* Keep looping till the slave acknowledge his address or maximum number
        of trials is reached (this number is defined by sEE_MAX_TRIALS_NUMBER define
        in stm32373c_eval_i2c_ee.h file) */
  
        /* Configure CR2 register : set Slave Address and end mode */
        I2C_TransferHandling(sEE_I2C, sEEAddress, 0, I2C_AutoEnd_Mode, I2C_No_StartStop);  
  
        do
        {
                /* Initialize sEETimeout */
                sEETimeout = sEE_FLAG_TIMEOUT;
   
                /* Clear NACKF */
                I2C_ClearFlag(sEE_I2C, I2C_ICR_NACKCF | I2C_ICR_STOPCF);
   
                /* Generate start */
                I2C_GenerateSTART(sEE_I2C, ENABLE);
   
                /* Wait until timeout elapsed */
                while (sEETimeout-- != 0);
   
                /* Check if the maximum allowed numbe of trials has bee reached */
                if (sEETrials++ == sEE_MAX_TRIALS_NUMBER)
                {
                        /* If the maximum number of trials has been reached, exit the function */
                        return sEE_TIMEOUT_UserCallback();
                }
        }
        while(I2C_GetFlagStatus(sEE_I2C, I2C_ISR_NACKF) != RESET);
  
        /* Clear STOPF */
        I2C_ClearFlag(sEE_I2C, I2C_ICR_STOPCF);
  
        /* Return sEE_OK if device is ready */
        return sEE_OK;
}

uint32_t sEE_TIMEOUT_UserCallback(void)
{
        /* Block communication and all processes */
        while (1)
        {   
        }
}

int main(void)
{
     I2C_Configuration();
     sEE_WriteBuffer(temp1,0x00,8);
       
     NumDataRead=8;               
       
     while(1)
     {
            sEE_ReadBuffer(temp2, 0x00,(INT16U *)(&NumDataRead));
     }
}
回复 支持 反对

使用道具 举报

31

主题

393

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-28
发表于 2015-10-14 16:03:20 | 显示全部楼层
楼主,你有调试过大于1页的i2c程序吗?
回复 支持 反对

使用道具 举报

31

主题

393

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-28
发表于 2016-3-14 14:14:37 | 显示全部楼层
你好,请问你有用过stm32f030的i2C中断方式的吗?
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
 楼主| 发表于 2016-3-14 14:22:30 | 显示全部楼层
alisa123 发表于 2016-3-14 14:14
你好,请问你有用过stm32f030的i2C中断方式的吗?

你好,用过的,怎么了,你用的哪个库
回复 支持 反对

使用道具 举报

31

主题

393

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-28
发表于 2016-3-14 15:31:43 | 显示全部楼层
lkl0305 发表于 2016-3-14 14:22
你好,用过的,怎么了,你用的哪个库

我用的的标准库stm32f0_stdperiph_lib.zip,你用的是哪个库,可否分享下你的中断方式啊?调了3天了,还是不能进入接收中断,我是用stm32f030的i2c读写EEPROM的数据。谢谢了
回复 支持 反对

使用道具 举报

31

主题

393

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-2-28
发表于 2016-3-14 15:34:37 | 显示全部楼层
楼主,我之前调试stm32f030的查询方式就是看了你的帖子才调试出来的,希望中断方式你也能指点下,非常感谢!
回复 支持 反对

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
 楼主| 发表于 2016-3-14 15:58:48 | 显示全部楼层
我现在基本用HAL库,用起来放便些,我这两天给你看看,你没有逻辑分析仪之类的么,调试一下看看哪里有问题?
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版