历史上的今天

今天是:2024年11月25日(星期一)

2019年11月25日 | STM8L15X 硬件I2C调试总结

发布者:变形金刚 来源: eefocus关键字:STM8L15X  硬件I2C  调试总结 手机看文章 扫描二维码
随时随地手机看文章

最近接到一个项目需要使用STM8L上硬件I2C与SN3731通信,用户方是个方案商,硬件设计人员也没留测试点,直接就把板子焊了拿来了。调试时除了swio口能用所有都不能用,硬件设计大概是为了显得自己焊接技术牛B吧,调试用的板子用0402的封装,IC除了找不到QFN的曲阿布都用的QFN,做项目时不能说,在这里我先问候一下他娘亲。,,,。


这块板子经过大量的补焊终于可以上电出时序了。


调试STM8的硬件I2C master 注意一下几点,可以少走弯路:


1、需要配置GPIO引脚为GPIO_Mode_Out_OD_HiZ_Slow或fast,如果要提高抗干扰能力,完全可以配置为推挽输出模式的,我使用的是GPIO_Mode_Out_PP_High_Slow,或Fast,否则手摸都可能死锁。


2、如果是开漏高阻的需要上拉电阻,这个电阻很重要,影响稳定性,手册上说4.7k是可以,建议小于这个值,否则手摸都可能卡死。这个还取决于slave端的电流拉动能力,其实就是ack时的上拉能力。


3、刚开始调试不建议用中断模式的


4、I2C的速度可调,数值我测试使用40k,实际测试基本准确,稳定了可根据slave情况提高速度


5、必须有slave端,否则你就在while中加超时以便可以跳出来,要不就会收不到slave的ack信号一直卡死在这里。也可以做解锁代码进去,我的如下(这个是为解决抗干扰后加的,实践证明很有效):


。。。

 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){if(++timeout>MaxTimeOut)goto stop;}


。。。


 stop:

    I2CClearStatus();

    I2C_GenerateSTOP(I2C1,ENABLE);  //停止信号  

    I2C_DeInit(I2C1);

    I2C_SoftwareResetCmd(I2C1,ENABLE);

    I2C_3731_Init(0);

 


硬件I2C并不像网上大部分人认为的这么多坑,对硬件熟悉的话不会走太多弯路,大部分卡死估计主要是地址不对,对于st的例程,如果地址是错的或者没接,或者没上电,或者没选通,或者关断使能了等等可能只要有一种情况发生,slave就根本不会响应ack,那么主机就一直在等待中,估计很多人是掉这个坑里了。


硬件I2C速度快(超过400khz没问题),省代码,如果软件的已经调通了还是推荐改成硬件的。


void I2C_3731_Init(unsigned char Addr)

{

 GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Slow);

                GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Slow);

                CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);

  /* I2C  clock Enable*/

  CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);  

  

  /* Initialize I2C peripheral */

  I2C_Init(I2C1,40000, Addr, //I2C_MAX_FAST_FREQ

           I2C_Mode_I2C, I2C_DutyCycle_2,

           I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);

}



void I2C_3731_BufferWrite(u8* pBuffer,u16 WriteAddr,u8 NumByte)//I2Cдº¯Êý

{

    while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));//»ñÈ¡Ö¸¶¨µÄ±ê־״̬£¨ÅжÏ×ÜÏß·±Ã¦×´Ì¬£©

    

    I2C_GenerateSTART(I2C1, ENABLE);

     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//¼ì²âÖ¸¶¨ÐźÅ״̬£¨EV5ʼþ£©Èç¹ûûÓз¢ËÍÍê³ÉÔÚÕâÀïµÈ´ý£¬×¢Ò⣡ºÅµÄÓ¦ÓÃ


     I2C_Send7bitAddress(I2C1,SLAVE_ADDRESS+((WriteAddr/256)<<1),I2C_Direction_Transmitter);//²»´óÓÚ24C16µÄÆ÷¼þµØÖ·

     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    

    I2C_SendData(I2C1,(u8)(WriteAddr));//µÍ8λ×Ö½ÚµØÖ·

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));//£¨EV8ʼþ£©

    

    while(NumByte--)

    {

        I2C_SendData(I2C1,*pBuffer);

        pBuffer++;

        

        if(NumByte==0)

        {

            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

        }

        else

        {

            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));

        }        

    }

    I2C_GenerateSTOP(I2C1,ENABLE);  //Í£Ö¹ÐźŠ  

}


void I2C_3731_BufferRead(u8* pBuffer,u16 ReadAddr,u8 NumByte)

{

    while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));

    I2C_GenerateSTART(I2C1,ENABLE);    

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

    

//    if(EE_TYPE>AT24C16)

//    {

//        I2C_Send7bitAddress(I2C1,SLAVE_ADDRESS,I2C_Direction_Transmitter);

//        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

//        

//        I2C_SendData(I2C1,(u8)(ReadAddr>>8));

//        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));

//    }

//    else

    {   //1010 000 0

        I2C_Send7bitAddress(I2C1,SLAVE_ADDRESS+((ReadAddr/256)<<1),I2C_Direction_Transmitter);

        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    }

    

    I2C_SendData(I2C1,(u8)(ReadAddr));

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));

    

    I2C_GenerateSTART(I2C1,ENABLE);    

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

    

    I2C_Send7bitAddress(I2C1,SLAVE_ADDRESS,I2C_Direction_Receiver);

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

    

    while(NumByte)

    {

        if(NumByte==1)

        {

            I2C_AcknowledgeConfig(I2C1,DISABLE);

            I2C_GenerateSTOP(I2C1,ENABLE); 

        }

        

        if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED))

        {

            *pBuffer=I2C_ReceiveData(I2C1);

            pBuffer++;

            NumByte--;

        }

    }

    

    I2C_AcknowledgeConfig(I2C1,ENABLE);

}


//main

I2C_3731_Init(0); 


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

      {

        TxBuffer[i] = i;

      }

      I2C_3731_BufferWrite(TxBuffer,0x00,sizeof(TxBuffer));


关键字:STM8L15X  硬件I2C  调试总结 引用地址:STM8L15X 硬件I2C调试总结

上一篇:STM8L051F3 硬件I2C从机实例
下一篇:STM8L的EEPROM读写原理及例程

推荐阅读

随着新兴市场需求不断扩大,机器人产业进入高速增长时期。而谈及中国的机器人产业,深圳市绕不开的地方。在2018年的CES(美国国际消费展)展会上,据主办方美国消费技术协会(CTA)的数据显示,约有500家参展来自深圳,占所有参展商的10%。深圳作为先进制造业的产业基地之一,机器人全产业链逐步完善,市场辐射能力日益强大。 深圳机器人产业收入占珠三...
基于51单片机控制的可上下楼的电梯仿真原理图如下:单片机源程序如下:#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f,0x06,0x5b,0x4f};uchar num,temp,busy,flag,uf,df,ref,now,next,setf,floor;uint tn;sbit start=P1^0;sbit F1=P1^1;sbit F2=P1^2;sbit F3=P1^3;...
今年早些时候推出的摩托罗拉Edge Plus,标志着该品牌在中断几年后重返旗舰市场。现在,根据TechnikNews与Adam Conway报道,该公司似乎很快就会推出又一款高端手机。据悉,即将推出的摩托罗拉高端手机型号为XT2125,代号为 “Nio”。这款手机将搭载与摩托罗拉Edge Plus类似的高通骁龙865 SoC。现在,摩托罗拉Nio其他主要规格,包括显示屏尺寸...
频谱分析仪通常内置许多测试功能,今天安泰测试就给大家分享一下基础频谱分析功能的仪器设置方法。常用设置参数:频率范围Center/SPAN:主要针对单一信号的分析,Center设为信号的中心频率,SPAN设为2倍信号带宽;如果临道功率测量,SPAN与信号带宽的倍数按照所观察的临道数目设置。Start/Stop:主要针对谐波、杂散或EMI设置,按要求设置测试起始和终止频...

史海拾趣

问答坊 | AI 解惑

ADI和LSI双双退出手机芯片业务 彰显DSP产业大转型

LSI将手机芯片业务出售给了英飞凌,ADI也将手机芯片业务出售给了MTK,并可能退出包括Blackfin处理器在内的整个DSP业务。另外,英飞凌和Broadcom成了诺基亚的新宠。在手机芯片这个最大的DSP应用市场,四大传统DSP芯片供应商(TI、Freescale、ADI和Ag ...…

查看全部问答∨

window下大家都用什么工具烧写nandflash!

有个友善的板子,想不通过Norflash,直接用nandflash烧写软件刷写nboot,eboot,NK 1、可不可以实现呢? 2、用什么软件啊…

查看全部问答∨

芯片logo,芯片型号请教

大家有没有知道芯片上印有类似F的logo,(我想把它贴上来的,但是发帖不能粘贴图片,我只能描述了) 标后是4828       bd4z11 这是什么型号,哪个厂家的芯片?…

查看全部问答∨

请教2450/51/16 MLC编译中文问题

各位大侠,有没有谁在用2450、51、16的BSP,使用MLC模式的?我遇到了一个奇怪的问题,编译英文的时候,没有任何问题,可以正常生成文件;但在编译中文的时候,报空间不够,后来我就修改了config.bib文件,可以编译通过了,但不能下载,下载报错。这 ...…

查看全部问答∨

一个在51上nor flash的读写问题。谢谢大家。

问题如下,我使用nor flash作为存储器。向flash写入数据,再读出来,以此验证读写操作是否正确。但是现在的问题是:我向flash写入0x80一下的数据再读出来,都很好。例如:写入0x14,那么读出来就是0x14.都没有问题。但是一旦到了0x80那么读出来的数 ...…

查看全部问答∨

如何购买周立功开发板EasyARM2131

本人住湛江,想购买周立功开发板EasyARM2131,却没有门路,请大家提供一下,谢谢。。。。。。。…

查看全部问答∨

数据采集delphi要怎么实现呢?

怎么做数据采集的程序呢?delphi要怎么实现呢?我现在刚开始学的,各位给讲讲把 …

查看全部问答∨

LoadLibrary的问题

小弟在LoadLibrary上碰到点问题,不知何顾。 过程是这样的 我的开发环境是CE6和VS2005 创建了一个Smart Device的动态连接库,但是在loadlibrary的时候 总是返回失败,板卡厂家提供的Driver有些是以动态连接库提供的,我loadlibrary,也返回失败 ...…

查看全部问答∨

从SD卡读出数据到TFT显示

采用数据重定向来实现,但是TFT不刷屏。。。…

查看全部问答∨

版主---IAR4.42A下是否Cortex-M3有芯片bug?

如题:/****************************************************** 测试情况如下: 1. IAR 4.42A 对Cortex-M3 会发生错误; 正确返回应为 0x00 2. STM32 or Luminary 均会出错; 3。测试的优化=None Or Low; 4. IAR 5.02/5.03 改正了此错 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved