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

我使用STM32G030F6 I2C2 进行AT24C256读写操作,始终不成功!不知道什么原因

[复制链接]
大大风 提问时间:2022-7-18 17:03 / 未解决
我使用STM32G030F6 I2C2 进行AT24C256读写操作,始终不成功!
收藏 评论18 发布时间:2022-7-18 17:03

举报

18个回答
大大风 回答时间:2022-7-19 10:14:54
int I2C_EE_PageWrite( uint16_t WriteAddr, uint8_t* pBuffer, uint16_t NumByteToWrite )
{
        uint16_t        timeout;
        int                        i;
       
        // While the bus is busy
        for( timeout = I2C_TIMEOUT; __HAL_I2C_GET_FLAG( &hi2c2, I2C_FLAG_BUSY ) != RESET; )
        {
                if( ( timeout--) == 0 )        goto I2C_WRITE_ERROR;
        }
       
        // Send Touch address for write        
        I2C_TransferConfig( &hi2c2, AT24CXX_ADDR, 2 + NumByteToWrite, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE );
       
        for( timeout = I2C_TIMEOUT; __HAL_I2C_GET_FLAG( &hi2c2, I2C_FLAG_TXIS ) == RESET; )
        {
                if( ( timeout--) == 0 )        goto I2C_WRITE_ERROR;
        }
       
        for( i = 0; i < 2; i++ )
        {
                // Test on EV8 and clear it
                for( timeout = I2C_TIMEOUT; __HAL_I2C_GET_FLAG( &hi2c2, I2C_FLAG_TXIS ) == RESET; )
                {
                        if( ( timeout--) == 0 )        goto I2C_WRITE_ERROR;
                }
                       
                switch( i )
                {
                case 0:        hi2c2.Instance->TXDR        =        ( WriteAddr & 0xFF00 ) >> 8;        break;
                case 1:        hi2c2.Instance->TXDR        =        WriteAddr & 0x00FF;                                break;
                }
        }
       
        I2C_TransferConfig( &hi2c2, AT24CXX_ADDR, NumByteToWrite, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP );
       
        // While there is data to be written
        while( NumByteToWrite-- )  
        {
                // Test on EV8 and clear it
                for( timeout = I2C_TIMEOUT; __HAL_I2C_GET_FLAG( &hi2c2, I2C_FLAG_TXIS ) == RESET; )
                {
                        if( ( timeout--) == 0 )        goto I2C_WRITE_ERROR;
                }

                // Send the current byte
                hi2c2.Instance->TXDR        =        *pBuffer;

                // Point to the next byte to be written
                pBuffer++;               
        }
       
        // Send STOP condition
        for( timeout = I2C_TIMEOUT; __HAL_I2C_GET_FLAG( &hi2c2, I2C_ISR_STOPF ) == RESET; )
        {
                if( ( timeout--) == 0 )        goto I2C_WRITE_ERROR;
        }
       
        hi2c2.Instance->CR2        |=        I2C_CR2_STOP;        //发送结束信号
       
        return TRUE;

I2C_WRITE_ERROR:
        hi2c2.Instance->CR2        |=        I2C_CR2_STOP;        //发送结束信号       
        return FALSE;       
}

大大风 回答时间:2022-7-19 10:11:28
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        if( hi2c->Instance == I2C2 )
        {
                __HAL_RCC_GPIOA_CLK_ENABLE();
               
                /* I2C2 GPIO Configuration
                PA11      ------> I2C2_SCL
                PA12      ------> I2C2_SDA */
               
                GPIO_InitStruct.Pin                        =        GPIO_PIN_11 | GPIO_PIN_12;
                GPIO_InitStruct.Mode                =        GPIO_MODE_AF_OD;
                GPIO_InitStruct.Pull                =        GPIO_NOPULL;
                GPIO_InitStruct.Speed                =        GPIO_SPEED_FREQ_MEDIUM;
                GPIO_InitStruct.Alternate        =        GPIO_AF6_I2C2;
                HAL_GPIO_Init( GPIOA, &GPIO_InitStruct );
               
                // Peripheral clock enable
                __HAL_RCC_I2C2_CLK_ENABLE();
        }
}

大大风 回答时间:2022-7-19 10:14:12
void I2C_DevInit(void)
{
        hi2c2.Instance                                =        I2C2;
        hi2c2.Init.Timing                        =        0x00602173;
        hi2c2.Init.OwnAddress1                =        0;
        hi2c2.Init.AddressingMode        =        I2C_ADDRESSINGMODE_7BIT;
        hi2c2.Init.DualAddressMode        =        I2C_DUALADDRESS_DISABLE;
        hi2c2.Init.OwnAddress2                =        0;
        hi2c2.Init.OwnAddress2Masks =        I2C_OA2_NOMASK;
        hi2c2.Init.GeneralCallMode        =        I2C_GENERALCALL_DISABLE;
        hi2c2.Init.NoStretchMode        =        I2C_NOSTRETCH_DISABLE;
        if( HAL_I2C_Init( &hi2c2 ) != HAL_OK )
        {
                Error_Handler();
        }

        if( HAL_I2CEx_ConfigAnalogFilter( &hi2c2, I2C_ANALOGFILTER_ENABLE ) != HAL_OK )
        {
                Error_Handler();
        }

        if( HAL_I2CEx_ConfigDigitalFilter( &hi2c2, 0 ) != HAL_OK )
        {
                Error_Handler();
        }
}

大大风 回答时间:2022-7-18 17:04:23
void I2C_DevInit(void){        hi2c2.Instance                                =        I2C2;        hi2c2.Init.Timing                        =        0x00602173;        hi2c2.Init.OwnAddress1                =        0;        hi2c2.Init.AddressingMode        =        I2C_ADDRESSINGMODE_7BIT;        hi2c2.Init.DualAddressMode        =        I2C_DUALADDRESS_DISABLE;        hi2c2.Init.OwnAddress2                =        0;        hi2c2.Init.OwnAddress2Masks =        I2C_OA2_NOMASK;        hi2c2.Init.GeneralCallMode        =        I2C_GENERALCALL_DISABLE;        hi2c2.Init.NoStretchMode        =        I2C_NOSTRETCH_DISABLE;        if( HAL_I2C_Init( &hi2c2 ) != HAL_OK )        {                Error_Handler();        }        if( HAL_I2CEx_ConfigAnalogFilter( &hi2c2, I2C_ANALOGFILTER_ENABLE ) != HAL_OK )        {                Error_Handler();        }        if( HAL_I2CEx_ConfigDigitalFilter( &hi2c2, 0 ) != HAL_OK )        {                Error_Handler();        }}


大大风 回答时间:2022-7-18 17:05:10
void I2C_DevInit(void)
{
        hi2c2.Instance                                =        I2C2;
        hi2c2.Init.Timing                        =        0x00602173;
        hi2c2.Init.OwnAddress1                =        0;
        hi2c2.Init.AddressingMode        =        I2C_ADDRESSINGMODE_7BIT;
        hi2c2.Init.DualAddressMode        =        I2C_DUALADDRESS_DISABLE;
        hi2c2.Init.OwnAddress2                =        0;
        hi2c2.Init.OwnAddress2Masks =        I2C_OA2_NOMASK;
        hi2c2.Init.GeneralCallMode        =        I2C_GENERALCALL_DISABLE;
        hi2c2.Init.NoStretchMode        =        I2C_NOSTRETCH_DISABLE;
        if( HAL_I2C_Init( &hi2c2 ) != HAL_OK )
        {
                Error_Handler();
        }

        if( HAL_I2CEx_ConfigAnalogFilter( &hi2c2, I2C_ANALOGFILTER_ENABLE ) != HAL_OK )
        {
                Error_Handler();
        }

        if( HAL_I2CEx_ConfigDigitalFilter( &hi2c2, 0 ) != HAL_OK )
        {
                Error_Handler();
        }
}

大大风 回答时间:2022-7-18 17:06:21
然后调用库函数
        uint16_t        timeout;
        int                        i;
        uint8_t                buf[ 256 ];
       
        buf[ 0 ]        =        ( WriteAddr & 0xFF00 ) >> 8;
        buf[ 1 ]        =        WriteAddr & 0x00FF;
       
        memcpy( &buf[ 2 ], pBuffer, NumByteToWrite );
        HAL_I2C_Master_Transmit( &hi2c2, AT24CXX_ADDR,  buf, NumByteToWrite + 2, 0x10 );

大大风 回答时间:2022-7-18 17:07:00
我用逻辑分析仪来监测,始终没有生成I2C波形
大大风 回答时间:2022-7-18 17:09:31


大大风 回答时间:2022-7-18 17:10:24


大大风 回答时间:2022-7-18 17:13:56
电路图
1.png

AT24C256原理图

AT24C256原理图
yklstudent 回答时间:2022-7-18 20:11:15
I2C2的时钟使能了嘛,还有引脚的配置也检查下啊?
大大风 回答时间:2022-7-18 20:20:50
主体代码是stmcube生成的,我检查过了,没有问题!时钟也使能了我猜测主要还是PA12(PA10)、PA11(PA9)这一块的配置,
butterflyspring 回答时间:2022-7-19 09:44:16

我看到cube库生成的代码应该是static void MX_I2C2_Init(void),楼主看看有没有遗漏什么?
另外在调试界面看看寄存器有没有配置成功。

大大风 回答时间:2022-7-19 10:13:30
这是管脚的配置,我也反正查了!不知道什么原因,就是不产生I2C_FLAG_TXIS中断,用逻辑分析仪监控管脚上的电平,也没有看到波形输出,不知道什么原因
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版