STM32 IIC频率

2019-10-11 16:03发布

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;
}



0条回答

一周热门 更多>