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

我使用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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版