OpenEdv-开源电子网

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

STM32 IIC频率

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-16
在线时间
5 小时
发表于 2017-3-16 17:01:41 | 显示全部楼层 |阅读模式
STM32 代码如何提高IIC频率。现在是200KHZ ,如何提高400KHZ 和1MHZ。谢谢。使用的是模拟IIC代码。

void IIC_Init(void)
{                        
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB, ENABLE );    //ʹÄÜGPIOBʱÖÓ
      
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ;   //ÍÆÍìÊä³ö
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);     //PB6,PB7 Êä³ö¸ß
}

void IIC_Start(void)     //²úÉúIICÆðʼÐźÅ
{
//    SDA_OUT();     //sdaÏßÊä³ö
    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;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
}      

void IIC_Stop(void)     //²úÉúIICÍ£Ö¹ÐźÅ
{
//    SDA_OUT();//sdaÏßÊä³ö
    IIC_SCL=0;
    IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
     delay_us(4);
    IIC_SCL=1;
    IIC_SDA=1;//·¢ËÍI2C×ÜÏß½áÊøÐźÅ
    delay_us(4);                                   
}
//µÈ´ýÓ¦´ðÐźŵ½À´
//·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü
//        0£¬½ÓÊÕÓ¦´ð³É¹¦
u8 IIC_Wait_Ack(void)
{
    u8 ucErrTime=0;
//    SDA_IN();      //SDAÉèÖÃΪÊäÈë  
    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;//ʱÖÓÊä³ö0        
    return 0;  
}
//²úÉúACKÓ¦´ð
void IIC_Ack(void)
{
    IIC_SCL=0;
//    SDA_OUT();
    IIC_SDA=0;
    delay_us(2);
    IIC_SCL=1;
    delay_us(2);
    IIC_SCL=0;
}
//²»²úÉúACKÓ¦´ð            
void IIC_NAck(void)
{
    IIC_SCL=0;
//    SDA_OUT();
    IIC_SDA=1;
    delay_us(2);
    IIC_SCL=1;
    delay_us(2);
    IIC_SCL=0;
}                                          
//IIC·¢ËÍÒ»¸ö×Ö½Ú
//·µ»Ø´Ó»úÓÐÎÞÓ¦´ð
//1£¬ÓÐÓ¦´ð
//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&0x18)>>7)
//            IIC_SDA=1;
//        else
//            IIC_SDA=0;
        txd<<=1;      
        delay_us(2);   //&#182;&#212;TEA5767&#213;&#226;&#200;&#253;&#184;&#246;&#209;&#211;&#202;±&#182;&#188;&#202;&#199;±&#216;&#208;&#235;&#181;&#196;
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;   
        delay_us(2);
    }     
}         
//&#182;&#193;1&#184;&#246;×&#214;&#189;&#218;&#163;&#172;ack=1&#202;±&#163;&#172;·&#162;&#203;&#205;ACK&#163;&#172;ack=0&#163;&#172;·&#162;&#203;&#205;nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
//    SDA_IN();//SDA&#201;è&#214;&#195;&#206;&#170;&#202;&#228;&#200;&#235;
    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();//·&#162;&#203;&#205;nACK
    else
        IIC_Ack(); //·&#162;&#203;&#205;ACK   
    return receive;
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 15:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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