历史上的今天
返回首页

历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2019年09月03日 | SPI I2C 的原理及在STM32上使用I2C总线的常见问题

2019-09-03 来源:eefocus

在微控制器中SPI,I2C是常用的挂接外设的总线,我们对他们的如果没有仔细研究的话我们对他们的认识基本就是串行,线少(I2C两根SCL SDA,SPI 单向3根双向4根 SCK MOSI MISO CS/LD ),多外设(SPI 可以并联也可以级联,I2C基本是随便接,地址不冲突即可),但是实际上这两种总线原理上还有有很大区别的,在微控制器上的操作及与程序控制流程也是完全不一样的。


SPI的原理 是主控使用SCLK 线,在SCLK信号的边沿 将数据寄存器的数据通过 MOSI一位一位的移出到 设备中 ,同时设备的寄存器也将数据在SCLK边沿的驱动下将数据通过MISO线一位一位的移出到主控中,所以SPI总线中读写是同时进行的,没有单独的读也没有单独的写,在微控制器端无论想读还是想写就是将数据填到DR存寄器中,MCU即自动开始传输,等待RXNE  BUSY TXE等信号置位便完成一个读或写操作。SPI状态也只有忙和不忙两种状态。


I2C总线与SPI完全不同,因为比SPI少了一根数据线和一根同步/片选线,I2C的内核涉及到状态机的问题,这也就导致了I2C的操作不像SPI那么简单。


串行通信必须有同步过程,SPI通过一根CS/LD数据线解决,I2C通过 生产START信号解决

器件的选通,SPI使用不同的CS线控制选通即可,I2C采用START+写入选通地址解决数据的传输与方向,SPI的MOSI MISO是固定线,无方向概念,I2C在根据选通地址的最低位决定是读还是写数据的确认与中止,SPI无确认,想中止拉高CS线即可,I2C需接收方使用ACK确认数据总线仲裁,SPI为固定主从不需要仲裁,I2C检查总线电平因为这些不同I2C在总线控制上比SPI要复杂的多在STM32上I2C常遇到的问题与解决办法,主要针对STM32做为主机方式


问题1: BUSY位被置位,即始使RESET后初始化总线后即被置位 不能发也不能收


出现原因:外设的不完整通信将SDA线的电平拉底,I2C内核认为总线被占用,除非总线被释放,否则拒绝操作总线(等着AT24系列自动释放总线?连RESET管脚都没有,呵呵吧)


解决办法:使用IO方式强行接管总线,以电平方式发出STOP信号 迫使设置释放总线,具体操作如下初始化前将将SCL SDL置成GPIO OUT_PP模式,拉底SCL,延时,拉低SDA,延时,抬高SCL,延时,抬高SDA 此时SCL SDA全为高电平,重新设定GPIO为ALT-OD模式再继续执行初始化I2C总线操作即可


问题2:在读取时多读一次数据


出现原因:未能正确控制NACK,与STOP位正确生成


解决办法:按手册要求,在倒数第2字节读取前便设置NACK位与STOP位,


        LL_I2C_AcknowledgeNextData(I2Cx,LL_I2C_NACK);

        LL_I2C_GenerateStopCondition(I2Cx);


问题3:如何检测AT24系列的E2ROM是否响应写操作


按手册要求在向AT24写数据过程中,写操作后面的STOP会使AT24进入内部写状态,判断是否写完成的依据是检测设备会不会在响应新的写操作,流程是START->ADDR->ACK?RESTART:STOP,可以按以下方法进行检测


写START->写 ADDR->直到检测到ADDR或AF被置位


如果AF被置位,清除AF重新执行START


如果ADDR被置位 表示操作完成,发送STOP退出查询 


注意不要用STM32中的头文件中定义的位进行比较


头文件定义如下


#define I2C_FLAG_AF                     0x00010400U

#define I2C_FLAG_ADDR                   0x00010002U


多出的那个高位1会使 如下的失效


flag  = (I2C1->SR1) | (I2C1->SR2 <<16);


if(flag & I2C_FLAG_AF) ......


最终的AT24 Pool函数如下


UINT8 I2C_Poll(UINT8 id,UINT8 devaddr)

{

    I2C_WaitBus(id);

    while(1)

    {

        I2C_Start(id);

        LL_I2C_TransmitData8(I2Cx,devaddr & 0xfe);

        GPIOB->BRR = GPIO_PIN_0;

        while(1){

            if(LL_I2C_IsActiveFlag_ADDR(I2Cx)) break;

            if(LL_I2C_IsActiveFlag_AF(I2Cx)) break;

        }

        if(LL_I2C_IsActiveFlag_AF(I2Cx)) 

        {

            LL_I2C_ClearFlag_AF(I2Cx);

            continue;

        }

        break;

    }

    LL_I2C_ClearFlag_ADDR(I2Cx);

    I2C_Stop(id);

}

推荐阅读

史海拾趣

Antex公司的发展小趣事

随着业务的不断扩展,Antex在1980年决定将工厂从东京都大田区羽田迁至茨城县高萩市。这一搬迁不仅为公司提供了更广阔的发展空间,也标志着Antex开始向着全球化布局迈进。此后,公司积极寻求国际合作,与全球各地的供应商和客户建立了紧密的合作关系。

Coherent Inc公司的发展小趣事

尽管电子行业竞争激烈,市场变化莫测,但Coherent Inc.始终保持着坚定的前行步伐。公司不断适应市场变化,调整战略方向,积极应对各种挑战。同时,公司也注重与合作伙伴的紧密合作,共同推动激光技术的创新和应用。这种坚定前行的态度,使得Coherent Inc.在电子行业中始终保持着领先的地位。

这五个故事只是Coherent Inc.发展历程中的一部分,但它们足以展示公司在电子行业中的崛起和发展。通过不断的探索、创新、收购与整合,以及坚定的前行态度,Coherent Inc.已经成为了激光技术领域的佼佼者,为电子行业的发展做出了重要贡献。

Fenghua (HK) Electronics Ltd公司的发展小趣事

作为一家有社会责任感的企业,Fenghua (HK) Electronics Ltd积极履行社会责任,关注环保和公益事业。公司采用了环保材料和节能技术,降低了生产过程中的能耗和排放。同时,公司积极参与社会公益活动,为当地社区和教育事业做出了积极贡献。这些举措不仅提升了公司的社会形象,也为企业的可持续发展奠定了坚实基础。

请注意,以上故事框架仅供参考,你可以根据Fenghua (HK) Electronics Ltd公司的实际情况和发展历程进行进一步的拓展和完善。

Bomar公司的发展小趣事

随着电子行业的快速发展,Bomar公司逐渐意识到,仅仅依靠石英晶振产品已经无法满足市场的多样化需求。于是,在1988年,公司开始积极建立OEM客户群,将业务范围拓展至电信、计算机、医疗、安全、商业和工业等多个领域。通过与这些客户的紧密合作,Bomar公司不仅成功推出了时钟振荡器、VCXOs和TCXOs等新产品,还根据客户需求重新设计了制造流程,提升了产品性能和生产效率。

CCS[Custom Computer Services]公司的发展小趣事

在电子行业的早期,CCS公司凭借其出色的研发能力,成功开发出一款具有革命性的计算机服务软件。这款软件不仅大幅提高了计算机的运行效率,还为用户提供了更加便捷的操作体验。凭借这一技术创新,CCS公司迅速在市场中崭露头角,赢得了大量客户的青睐。随着技术的不断迭代和升级,CCS公司始终保持在行业前沿,逐渐发展成为电子行业的领军企业。

CLANDELL公司的发展小趣事

在电子产品市场日益同质化的背景下,CLANDELL公司意识到技术创新的重要性。公司投入大量资源研发新型电子元件,通过优化设计和材料选择,成功推出了具有更高性能、更低能耗的电子产品。这一创新不仅提升了CLANDELL公司的市场竞争力,也为整个行业带来了技术进步的推动力。

问答坊 | AI 解惑

简述变频供水系统的一种设计方法

1 引言   各类用水部门由于供水系统的水压力不足而引起的生活、消防、工业、农业节水微灌等供水问题是经常发生的事情。科学技术的发展为解决这些问题创造了良好的条件。过去常采用的水泵、水塔、水箱等供水方式,由于存在供水压力和流量不能调节 ...…

查看全部问答>

晕,运营商和厂商的三不沾空间~~~

昨天爸爸的手机,突然没法拨电话,显示话费已经达到最大值。 估计是不知怎的,系统设置了个话费最大限额的功能 于是想要更改设置,要求输入PIN2码 百度一查, \"Pin2码是由供应商提供的Sim卡另一密码,用于限定拨号等功能的个人识别码,主要用 ...…

查看全部问答>

DSP芯片选择方法

一般而言,定点DSP芯片的价格较便宜,功耗较低,但运算精度稍低。而浮点DSP芯片的优点是运算精度高,且C语言编程调试方便,但价格稍贵,功耗也较大。例如TI的TMS320C2XX/C54X系列属于定点DSP芯片,低功耗和低成本是其主要的特点。而TMS320C3X/C4X/C ...…

查看全部问答>

wince系统软件开发

我想问下,我现在已经通过evc编写好了EXE程序,而且有了arm9的板子,我想让系统开启后直接进入我的应用程序界面,还需要什么工具吗? 我看有人说需要自己定制sdk,我现在就有wince4.0,还需要什么工具,求高手指教了…

查看全部问答>

mini2440板子bootloader问题

这样的,mini2440中有个2440test的测试板子的程序,程序中的2440init.s初始化文件有一个代码复制的部分,其中可以判断是nandflash启动还是norflash启动,其中判断是nandflash启动之后复制nandflash中的代码到sdram中最后又会到copy_proc_beg部分来 ...…

查看全部问答>

wince下语音识别的实现

wince支持ISpVoice吗?帮助说支持的。可代码在模拟器下调试一点反应都没有,也不说话。啥原因啊?想搞个类似语音拨号的东东,大侠们帮帮忙啊。 wince下怎么实现语音识别的?能在模拟器上调试吗? 有没有好的解决方案啊?…

查看全部问答>

PCB制作相关资料

PCB制作相关资料,希望对大家有用!…

查看全部问答>

stm32 USART 配置问题

我想实现 串口2按 9600  7bit数据 2bit停止 even(偶)校验 收发  怎么配置啊??…

查看全部问答>

求指点

AVRISP mkii  支持在线调试吗?…

查看全部问答>