最近接到一个项目需要使用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();

硬件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,, 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/)<<),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==)
{
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/)<<),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==)
{
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(); for (i = ; i < BUFFERSIZE; i++)
{
TxBuffer[i] = i;
}
I2C_3731_BufferWrite(TxBuffer,0x00,sizeof(TxBuffer));

STM8L15X 硬件I2C调试总结的更多相关文章

  1. STM32 硬件I2C 到底是不是个坑?

    /** ****************************************************************************** * @author    Maox ...

  2. 浅谈STM32L071硬件I2C挂死

    STM32的IIC问题一直存在,在网上也被很多人吐槽,然而FAE告诉我,硬件IIC的问题在F1,F3,F4系列单片机存在,而在L0上已经解决了,然而这几天调试加密芯片和显示芯片,都是IIC芯片,却再一 ...

  3. nRF52832之硬件I2C

    这几天一直在折腾nRF52832的硬件I2C,到了今天最终出现了成果,在此也印证了那句话:"耕耘就有收获" 52832的硬件I2C尽管官方提供了demo,可是自己对I2C通信理解的 ...

  4. STM32F407的硬件I2C

    源:STM32F407的硬件I2C 我使用的是STM32的固件库. 硬件模块使用之前必须配置其参数,I2C的配置如下: void IIC_Config(void) { GPIO_InitTypeDef ...

  5. STM32F10x_模拟I2C读写_硬件I2C读写

    STM32F10x_模拟I2C读写EEPROM STM32F10x_硬件I2C读写EEPROM(标准外设库版本) STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

  6. MSP430G2553 Launchpad 硬件I2C驱动

    一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A ...

  7. STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

    Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信. ...

  8. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要内容:I2C协议.模 ...

  9. 浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)

    引子 STM32的硬件I2C很多人都对它望而却步.因为很多电工都说,STM32 硬件 I2C有BUG.不稳定.死机等等……最后都使用GPIO模拟I2C. 的确,模拟I2C好用.但是在我看来在一个72M ...

随机推荐

  1. 第四阶段:1.从零打造一款社区web产品

    ---恢复内容开始--- 熟人关系:微信 陌生人关系:微博 1.把各种竞品罗列起来形成一个分析池.分析其目标用户是哪些.这些产品满足了用户什么需求.可以从时间角度分析趋势.针对每一类竞品画一个商业模式 ...

  2. 第二阶段:2.商业需求分析及BRD:3.产品需求分析

    产品需求收集之后就可以进行产品需求分析了. 比如微信功能的逐步完善,偏向于做加法,但有时候也会做减法. Y轴是重要跟不重要 X轴是紧急跟不紧急 然后通过各个需求的分数来确定坐标位置.同时可以根据阶段调 ...

  3. Xcode崩溃日志分析工具symbolicatecrash用法

    1.什么是symbolicatecrash? symbolicatecrash是Xcode自带的一个分析工具,可以通过机器上的崩溃日志和应用的.dSYM文件定位发生崩溃的位置,把crash日志中的一堆 ...

  4. linux-iptables匹配条件总结(一)

    指定单个ip,示例如下: iptables -A INPUT -s 192.168.2.85 -j ACCEPT ![](https://img2018.cnblogs.com/blog/189009 ...

  5. HBase学习笔记(一)——基础入门

    1.what:什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储. HBase是一个高可靠 ...

  6. 「Luogu P1435」回文字串 解题报告

    题面 主要大衣大意: 给定一个字符串,求至少加入多少个字符才能使字符串变成回文字符串 下面就是我一本正经的胡说八道题解 思路: 很显然,这应该是一道典型的最长公共子序列的题目 因此,主要思想就是DP ...

  7. 简单了解linux内核

    linux内核是单块结构Linux能动态的按需装载或卸载模块Linux内核线程以一种十分受限制的方式来周期性地执行几个内核函数,因为linux内核线程不能执行用户程序,因此,她们并不代表基本的可执行上 ...

  8. 为什么大家都说Java中只有值传递?

    最近跟Java中的值传递和引用传递杠上了,一度怀疑人生.查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递.也搞明白了,为什么大家都说Java只有值传递,没有引用传递.原来,我一直以来 ...

  9. ConcurrentHashMap源码解析 JDK8

    一.简介 上篇文章详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理. 首先在看本文之前,希望对HashMap有一个详细的了解.不然看直接看Concur ...

  10. python如何计算程序(代码块)的运行时间?

    1.引入time模块 2.调用time模块的time()函数 :用来获取当前的时间,返回的单位是秒 # 引入一个time模块, * 表示time模块的所有功能, # 作用: 可以统计程序运行的时间 f ...