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

楼主: 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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版