历史上的今天
返回首页

历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2018年10月08日 | stm32普通IO口模拟iic时序

2018-10-08 来源:eefocus

1,用stm32的普通IO口模拟iic时序,可以用较少的IO口实现iic功能,在实际使用中有很大优势。

2,stm32的IO可以设置为推挽,开漏输出模式,在开漏输出下,如果带上拉电阻,则可以双向传输数据,

如输出1(PCout()=1),从它的输入引脚可以读出状态(PCin()),

这样在不需要配置输入,输出模式,就可以实现iic数据线的写和读。

程序实现过程:

#define AT_IIC_SCL          PCout(12)    

#define AT_IIC_SDA          PCout(11)    

#define AT_IIC_SDA_READ     PCin(11)

void I2cIoInit()

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );  

   

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_SetBits(GPIOC,GPIO_Pin_12|GPIO_Pin_11);

}

void I2cStart()

{

    AT_IIC_SDA=1;

    AT_IIC_SCL=1;

    delay_us(4);

    AT_IIC_SDA=0;      

    delay_us(4);

    AT_IIC_SCL=0;      

}

void I2cStop()

{

    AT_IIC_SCL=0;

    AT_IIC_SDA=0;      

    delay_us(4);

    AT_IIC_SCL=1;

    AT_IIC_SDA=1;      

    delay_us(4);

}

uint8_t I2cWaitAck()

{

    uint8_t errTimes=0;

    AT_IIC_SDA=1;

    delay_us(1);

    AT_IIC_SCL=1;

    delay_us(1);

    while(AT_IIC_SDA_READ)

    {

        errTimes++;

        if(errTimes>250)

        {

            I2cStop();

            return 1;

        }

    }

    AT_IIC_SCL=0;      

    return 0;

}

void I2cAck()

{

    AT_IIC_SCL=0;

    AT_IIC_SDA=0;

    delay_us(2);

    AT_IIC_SCL=1;

    delay_us(2);

    AT_IIC_SCL=0;

}

void I2cNoAck()

{

    AT_IIC_SCL=0;

    AT_IIC_SDA=1;

    delay_us(2);

    AT_IIC_SCL=1;

    delay_us(2);

    AT_IIC_SCL=0;

}

void I2cSendByte(uint8_t txdata)

{

    uint8_t t;

    AT_IIC_SCL=0;          

    for(t=0;t<8;t++)

    {

        if((txdata&0x80)>>7)

        {

            AT_IIC_SDA=1;

        }

        else

        {

            AT_IIC_SDA=0;

        }

        txdata<<=1;

        delay_us(2);        

        AT_IIC_SCL=1;

        delay_us(2);

        AT_IIC_SCL=0;

        delay_us(2);

    }

}

uint8_t I2cReadByte(uint8_t ack)

{

    unsigned char i,receive=0;

    for(i=0;i<8;i++ )

    {

        AT_IIC_SCL=0;

        delay_us(2);

        AT_IIC_SCL=1;

        receive<<=1;

        if(AT_IIC_SDA_READ)

        {

            receive++;

        }

        delay_us(1);

    }

    if (!ack)

    {

        I2cNoAck();    

    }

    else

    {

        I2cAck();      

    }

    return receive;

}


推荐阅读

史海拾趣

Fairchild (ON Semiconductor)公司的发展小趣事

2016年,Fairchild Semiconductor被ON Semiconductor收购。这一收购标志着Fairchild Semiconductor的发展进入了一个新的阶段。ON Semiconductor是一家全球领先的半导体公司,拥有广泛的产品线和强大的技术实力。通过整合Fairchild Semiconductor的技术和资源,ON Semiconductor进一步巩固了其在半导体行业中的领导地位,并继续为全球客户提供优质的半导体产品和服务。

Gilway Technical Lamp公司的发展小趣事
不要将过多食物放入冰箱内,以免影响制冷效果和耗电量。
Capar Components Corp公司的发展小趣事

随着国内市场的饱和,Capar Components Corp开始将目光投向国际市场。公司积极参加国际电子展会,与海外客户建立联系,拓展销售渠道。同时,公司还根据不同国家和地区的市场需求,调整产品结构和营销策略,逐步打开了国际市场的大门。如今,公司的产品已经远销欧美、东南亚等多个国家和地区,成为了国际电子市场上的一支重要力量。

Global Specialties公司的发展小趣事

在电子技术的不断推动下,Global Specialties始终保持对新技术的高度敏感。公司不断投入研发资源,对现有产品进行升级换代,并推出了一系列具有创新性的新产品。例如,公司开发的智能测试仪器能够自动完成复杂的测试任务,大大提高了测试效率和准确性。这些技术创新不仅巩固了Global Specialties在业内的领先地位,还为公司带来了更多的商业机会。

Green Power Solutions公司的发展小趣事
安装完毕后,仔细检查电路连接是否正确,然后通电测试稳压器的输出电压和稳压精度是否正常。
康奈特(CNNT)公司的发展小趣事

在光学镜片领域,产品质量是企业的生命线。康奈特深知这一点,因此从原材料采购到生产制造的每一个环节都建立了严格的品控体系。公司引进了先进的检测设备和技术手段,对每一片镜片都进行严格的检测和筛选。这种对质量的执着追求不仅赢得了消费者的信赖和认可,也为公司赢得了良好的口碑和市场份额。

问答坊 | AI 解惑

用电阻做功率模拟

请教各位,我现在测一块散热板的散热效率,打算用铜壳线绕电阻做一个30W的发热源,电阻型号有以下几款 220Ω/5W;500Ω/8W;输入电压在60V左右,请问应该怎样排列电阻效果才好?谢谢!…

查看全部问答>

闪电击中世界最高建筑哈利法塔

上面这张令人震惊的照片展示了世界最高建筑哈利法塔遭闪电击中时的场面。 照片的拍摄者是一位23岁名叫穆罕默德·哈姆丹的学生,来自巴基斯坦,目前在阿联酋攻读建筑工程学。当时,迪拜正遭受暴风雨的袭击。雷电中,高达828米的哈利法塔在紫色的 ...…

查看全部问答>

今天参加mcu day赠送的一款开发板

参加TI mcu Day时,送的开发板,据说可以当做jtag仿真器使用,双重功能!!!…

查看全部问答>

U盘多盘符的问题

我在一个嵌入式系统中,主机在GET MAX LUN我已经返回01,但是主机并未显示2个盘符.仅仅出现了一个盘符 还需要做哪方面的工作…

查看全部问答>

关于桥式整流

这是在空闲之际模拟的几张桥式整流和接电容的图片,希望能对大家有点用处。    大家注意看波形随着电容的变化而变化。…

查看全部问答>

hmc5883的程序有人做过么?我的程序哪里出问题了?本人菜鸟,见笑了。

调了好几个小时了,就是不知道问题在哪里,请高手们指点。 测量先不说,就是怎么读寄存器都没弄清。 看了中文的pdf了,但是还是没搞懂,先看看我的程序吧。 程序部分(已近将无关部分删除): uchar code table[]=\"0123456789\"; //////////// ...…

查看全部问答>

有谁用了ADS8332,求程序!

最近用到团购买回来的ADS8332,但是调试了两天没成功,求助各位!谢谢!…

查看全部问答>

debug正常,51运算错误

已经用其他程序试验过了,不是xdata的问题,xdata里的数据能正常使用。我在用51做一个32点的fft。 部分代码如下: #include #include #define  uchar  unsigned  char #define  uint unsigned int ...…

查看全部问答>

谁用单片机驱动过PS2的数字小键盘?

我在网上买了一块PS2的数字小键盘,就是传统台式机键盘最右边的数字键部分。 学习了一下PS2及扫描编码相关内容,看懂了程序,但是,由于小键盘只有部分按键,有的键还是不能读取。 0—9数字键是可以输入的,小键盘的enter也能读取,但+、-、*、/ ...…

查看全部问答>