STM8L15X 硬件I2C调试总结

eefocus · 电子工程世界·2020-09-16 00:00

1.4k

最近接到一个项目需要使用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 调试总结 编辑:什么鱼 引用地址: http://news.eeworld.com.cn/mcu/ic510355.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

广告

eefocus · 电子工程世界·2020-09-16 00:00

1.4k
  • STM
  • ST
  • 用户热评
    打开摩尔芯球APP,查看更多评论

    重大事件及时推送,更流畅的沉浸式阅读体验

    参与评论

    0/200字

    登录后即可发布评论

    发布评论

    请使用浏览器自带的分享按钮,
    将你这篇文章分享出去吧。
    +86
    获取验证码
    登 录

    邮箱登录

    未注册过的用户将直接为你创建摩尔账号