OpenEdv-开源电子网

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

移植战舰版例程中的I2C例程到stm32f103c8t6中的问题

[复制链接]

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-3-28
在线时间
59 小时
发表于 2020-3-7 17:33:28 | 显示全部楼层 |阅读模式
1金钱
原子哥,我移植了你战舰版例程中的I2C例程,我就是改了一下IO引脚,为什么程序不能读写,其它地方还有需要更改的地方吗?
int main()
{
   temp=AT24CXX_Check();
   printf("temp:%d\r\n",temp);

  while(1);
}

为什么读写不出来,temp返回值是1,失败的,麻烦大佬帮忙指点一下。

void I2C_Init(void)
{               
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);        
}


#define SDA_IN()  {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=(u32)8<<12;}//
#define SDA_OUT() {GPIOB->CRH&=0X0FFFFFFF;GPIOB->CRH|=(u32)3<<12;}//


#define IIC_SCL    PBout(10) //SCL
#define IIC_SDA    PBout(11) //SDA         
#define READ_SDA   PBin(11)  //



void IIC_Start(void)
{
        SDA_OUT();     //sda&#207;&#223;ê&#228;3&#246;
        IIC_SDA=1;                    
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC_SCL=0;//
}          

void IIC_Stop(void)
{
        SDA_OUT();//sda&#207;&#223;ê&#228;3&#246;
        IIC_SCL=0;
        IIC_SDA=0;//
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;//·
        delay_us(4);                                                                  
}

u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      
        IIC_SDA=1;delay_us(1);          
        IIC_SCL=1;delay_us(1);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;          
        return 0;  
}

void IIC_Ack(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}
                    
void IIC_NAck(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=1;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}                                                                              
                  
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();             
    IIC_SCL=0;//
    for(t=0;t<8;t++)
    {              
        //IIC_SDA=(txd&0x80)>>7;
                if((txd&0x80)>>7)
                        IIC_SDA=1;
                else
                        IIC_SDA=0;
                txd<<=1;           
                delay_us(2);
                IIC_SCL=1;
                delay_us(2);
                IIC_SCL=0;       
                delay_us(2);
    }         
}             

u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();
    for(i=0;i<8;i++ )
        {
        IIC_SCL=0;
        delay_us(2);
                IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
                delay_us(1);
    }                                         
    if (!ack)
        IIC_NAck();//
    else
        IIC_Ack(); //
    return receive;
}


u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                  
        u8 temp=0;                                                                                                                                                               
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);          
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr>>8);
                IIC_Wait_Ack();                 
        }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));            

        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);  
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XA1);                           
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);                  
    IIC_Stop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t            
        return temp;
}

void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                                                                                                          
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr>>8);
        }else
        {
                IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   
        }         
        IIC_Wait_Ack();          
    IIC_Send_Byte(WriteAddr%256);  
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);                                                       
        IIC_Wait_Ack();                                
    IIC_Stop();//
        delay_ms(10);         
}



最佳答案

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

1.注意delay_ms(),原子例程是主频为72M然后8分频作为滴答定时器的时钟 2.“GPIOB->CRH&=0X0FFFFFFF” 改为 “GPIOB->CRH&=0XFFFF0FFF”试试 3.还不行,看能参考帖子不 http://www.openedv.com/forum.php?mod=viewthread&tid=303251&highlight=C8T6%2BIIC
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2020-3-7 17:33:29 | 显示全部楼层
1.注意delay_ms(),原子例程是主频为72M然后8分频作为滴答定时器的时钟
2.“GPIOB->CRH&=0X0FFFFFFF” 改为 “GPIOB->CRH&=0XFFFF0FFF”试试
3.还不行,看能参考帖子不
http://www.openedv.com/forum.php ... ighlight=C8T6%2BIIC
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-3-28
在线时间
59 小时
 楼主| 发表于 2020-3-7 18:09:09 | 显示全部楼层
peng1554 发表于 2020-3-7 17:49
1.注意delay_ms(),原子例程是主频为72M然后8分频作为滴答定时器的时钟
2.“GPIOB->CRH&=0X0FFFFFFF”  ...

同样的myiic.c,我移植的OLED 屏幕(I2C协议)是能正常通信的。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2020-3-7 19:56:33 | 显示全部楼层
chenjian1419 发表于 2020-3-7 18:09
同样的myiic.c,我移植的OLED 屏幕(I2C协议)是能正常通信的。

好吧~~
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-3-28
在线时间
59 小时
 楼主| 发表于 2020-3-7 21:53:59 | 显示全部楼层

非常感谢你,已经解决了,就是您回答的第二个问题,改了就正常了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 19:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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