OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4666|回复: 11

STM32F407 探索者硬件I2C问题

[复制链接]

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2015-3-2
在线时间
36 小时
发表于 2017-8-30 14:30:56 | 显示全部楼层 |阅读模式
1金钱
我用原子探索者开发板,想用硬件I2C来读AT24C02,不过发现PB8、PB9映射不到I2C。用逻辑分析仪抓不到任何波形,这两个pin一直为高,而换成PB6、PB7就可以。
不知道各位大神有没有碰到这种问题。

最佳答案

查看完整内容[请看2#楼]

不用,我也学习而已
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 14:30:57 | 显示全部楼层
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 14:59:24 | 显示全部楼层
我用的就是PB8,PB9.没问题, 你的配置有问题吧
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2015-3-2
在线时间
36 小时
 楼主| 发表于 2017-8-30 15:19:35 | 显示全部楼层
huanghan 发表于 2017-8-30 14:59
我用的就是PB8,PB9.没问题, 你的配置有问题吧

GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_I2C1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_I2C1);
               
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;

就这三处,我把8,9改成6,7就能抓到波形,可以将你的代码分享出来看一下吗?
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 16:03:14 | 显示全部楼层
芯片型号是什么,给你弄一个测试程序
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2015-3-2
在线时间
36 小时
 楼主| 发表于 2017-8-30 16:21:12 | 显示全部楼层
huanghan 发表于 2017-8-30 16:03
芯片型号是什么,给你弄一个测试程序

谢谢!STM32F407ZGT6, 就是在原子 探索者板子玩,我也可以把我的代码发出来给你看一下
void ODM_I2C_Init(I2C_TypeDef *I2Cx,u16 speed)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        //NVIC_InitTypeDef NVIC_InitStruct;
        I2C_InitTypeDef  I2C_InitStruct;
        //RCC_ClocksTypeDef RCC_Clock;
       
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
        GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_25MHz;
       
        I2C_InitStruct.I2C_Ack=I2C_Ack_Enable;
        I2C_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
        I2C_InitStruct.I2C_ClockSpeed=speed*1000;
        I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2;
        I2C_InitStruct.I2C_Mode=I2C_Mode_I2C;

//        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=4;
//        NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
//        NVIC_InitStruct.NVIC_IRQChannelCmd=DISABLE;

//        RCC_GetClocksFreq(&RCC_Clock);
        //ulTimeOut_Time=(RCC_Clock.SYSCLK_Frequency/10000);
       
        if(I2Cx==I2C1)                //I2C1
        {
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
               
                GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_I2C1);
                GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_I2C1);
               
                GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
                GPIO_Init(GPIOB,&GPIO_InitStruct);
               
                RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,ENABLE);
                RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,DISABLE);
               
                I2C_DeInit(I2C1);
                I2C_InitStruct.I2C_OwnAddress1=0xAA;
                I2C_Cmd(I2C1,ENABLE);
                I2C_Init(I2C1,&I2C_InitStruct);
                I2C_AcknowledgeConfig(I2C1, ENABLE);
               
                NVIC_InitStruct.NVIC_IRQChannel=I2C1_EV_IRQn;
                NVIC_Init(&NVIC_InitStruct);
        }       
        else if(I2Cx==I2C2)                //I2C2
        {
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
               
                GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_I2C2);
                GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_I2C2);
               
                GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
                GPIO_Init(GPIOB,&GPIO_InitStruct);
               
                I2C_DeInit(I2C2);
                I2C_InitStruct.I2C_OwnAddress1=0x99;
                I2C_Init(I2C2,&I2C_InitStruct);
                I2C_Cmd(I2C2,ENABLE);
               
                NVIC_InitStruct.NVIC_IRQChannel=I2C2_EV_IRQn;
                NVIC_Init(&NVIC_InitStruct);
        }       
}


void I2C_Read_nByte(I2C_TypeDef *I2Cx,u8 DeviceAddr,u8 RegAddr,u8 *RData,u8 len)
{
        u32 TimeOut=10000;
        I2C_AcknowledgeConfig(I2Cx,ENABLE);
        while((TimeOut--)&&I2C_GetFlagStatus(I2Cx,I2C_FLAG_BUSY));

        I2C_GenerateSTART(I2Cx,ENABLE);
        TimeOut=10000;
        while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)));
        if(TimeOut==0)        printf("2");

        I2C_Send7bitAddress(I2Cx,DeviceAddr,I2C_Direction_Transmitter);
        TimeOut=10000;
        while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)));
        if(TimeOut==0)        printf("3");
       
        I2C_SendData(I2Cx,RegAddr);
        TimeOut=10000;
        while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
        if(TimeOut==0)        printf("4");
       
        I2C_GenerateSTART(I2Cx,ENABLE);       
        TimeOut=10000;
        while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)));
        if(TimeOut==0)        printf("5");

        I2C_Send7bitAddress(I2Cx,DeviceAddr,I2C_Direction_Receiver);
        TimeOut=10000;
        while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)));
        if(TimeOut==0)        printf("6");

        //I2C_AcknowledgeConfig(I2Cx,DISABLE);
        I2C_AcknowledgeConfig(I2Cx,ENABLE);
        //I2C_GenerateSTOP(I2Cx,ENABLE);

        while(len--)
        {                               
                *(RData++)=I2C_ReceiveData(I2Cx);
                TimeOut=10000;
                while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_RECEIVED)));
                if(TimeOut==0)        printf("7");
        }
       
        I2C_GenerateSTOP(I2Cx,ENABLE);
}

回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 16:58:07 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-30 17:02 编辑

好了,你可以试试....
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 17:06:12 | 显示全部楼层
好了,好难上传...

I2C_test.rar

5.09 MB, 下载次数: 294

回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2015-3-2
在线时间
36 小时
 楼主| 发表于 2017-8-30 17:39:26 | 显示全部楼层
huanghan 发表于 2017-8-30 17:06
好了,好难上传...

特别感谢,我试一试!
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 19:09:46 | 显示全部楼层
飞羽无痕 发表于 2017-8-30 17:39
特别感谢,我试一试!

用示波器测试,绝对有波形
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2015-3-2
在线时间
36 小时
 楼主| 发表于 2017-8-31 08:46:55 | 显示全部楼层
huanghan 发表于 2017-8-30 19:09
用示波器测试,绝对有波形

确实有了,谢谢!
回复

使用道具 举报

3

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
258
金钱
258
注册时间
2016-9-17
在线时间
41 小时
发表于 2017-9-4 22:56:17 来自手机 | 显示全部楼层
好东西啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 07:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表