最近接到一个项目需要使用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));
上一篇:STM8L051F3 硬件I2C从机实例
下一篇:STM8L的EEPROM读写原理及例程
推荐阅读
史海拾趣
在全球化的大背景下,供应链管理对于企业的运营效率至关重要。CUI公司高度重视供应链的优化和管理,通过建立完善的采购、生产和销售体系,实现了原材料的稳定供应和产品的快速交付。此外,公司还积极引入先进的生产设备和信息化管理系统,提高了生产效率和产品质量,为公司的快速发展提供了有力保障。
为了满足全球市场的需求,BK Precision开始实施全球化战略。公司不仅在美国本土设立了多个办事处和研发中心,还在欧洲和亚洲等地建立了分支机构。通过与国际授权分销商的合作,BK Precision成功地将产品推向全球市场,并赢得了众多国际客户的信赖。同时,公司还积极参与国际电子行业的展会和交流活动,提升品牌知名度和影响力。
随着技术的不断进步和市场的逐步打开,弘凯光电开始将业务拓展至全球范围。公司的客户群迅速扩大,遍布60多个国家和地区,同时在欧洲、北美、南美、东南亚和中东地区均设立了经销网点。此外,弘凯光电还积极寻求国际认证,以证明其产品的品质和可靠性。通过取得ISO9001质量保证体系、ISO14001国际环境管理体系认证等一系列认证,公司进一步提升了品牌形象和市场竞争力。
随着国内市场的饱和,Elcos AG开始寻求国际化拓展的机会。公司首先在欧洲市场建立了销售网络,通过与当地合作伙伴的紧密合作,逐渐打开了欧洲市场的大门。随后,Elcos AG又将目光投向了亚洲和北美市场,通过设立海外办事处和参加国际展会等方式,积极推广公司品牌和产品。在国际市场的竞争中,Elcos AG凭借其卓越的产品品质和完善的售后服务体系,赢得了众多客户的信赖和支持。
随着公司规模的扩大和业务的增长,Elcos AG面临着供应链管理的挑战。为了降低成本、提高效率和保证产品质量,公司决定对供应链进行优化。通过引入先进的供应链管理软件、加强与供应商的合作和建立严格的质量控制体系等措施,Elcos AG成功实现了供应链的优化和升级。这不仅提高了公司的运营效率和市场竞争力,还为客户提供了更加稳定可靠的产品和服务。
佰宏公司始终坚持开放合作的理念,与多家知名企业建立了战略合作伙伴关系。例如,与立讯精密、奋达科技等实力企业的合作,不仅为佰宏带来了更多的业务机会,也进一步提升了公司的品牌影响力和市场地位。这些合作不仅带来了经济效益,更为佰宏的长远发展奠定了坚实的基础。
LSI将手机芯片业务出售给了英飞凌,ADI也将手机芯片业务出售给了MTK,并可能退出包括Blackfin处理器在内的整个DSP业务。另外,英飞凌和Broadcom成了诺基亚的新宠。在手机芯片这个最大的DSP应用市场,四大传统DSP芯片供应商(TI、Freescale、ADI和Ag ...… 查看全部问答∨ |
有个友善的板子,想不通过Norflash,直接用nandflash烧写软件刷写nboot,eboot,NK 1、可不可以实现呢? 2、用什么软件啊… 查看全部问答∨ |
大家有没有知道芯片上印有类似F的logo,(我想把它贴上来的,但是发帖不能粘贴图片,我只能描述了) 标后是4828 bd4z11 这是什么型号,哪个厂家的芯片?… 查看全部问答∨ |
各位大侠,有没有谁在用2450、51、16的BSP,使用MLC模式的?我遇到了一个奇怪的问题,编译英文的时候,没有任何问题,可以正常生成文件;但在编译中文的时候,报空间不够,后来我就修改了config.bib文件,可以编译通过了,但不能下载,下载报错。这 ...… 查看全部问答∨ |
问题如下,我使用nor flash作为存储器。向flash写入数据,再读出来,以此验证读写操作是否正确。但是现在的问题是:我向flash写入0x80一下的数据再读出来,都很好。例如:写入0x14,那么读出来就是0x14.都没有问题。但是一旦到了0x80那么读出来的数 ...… 查看全部问答∨ |
|
小弟在LoadLibrary上碰到点问题,不知何顾。 过程是这样的 我的开发环境是CE6和VS2005 创建了一个Smart Device的动态连接库,但是在loadlibrary的时候 总是返回失败,板卡厂家提供的Driver有些是以动态连接库提供的,我loadlibrary,也返回失败 ...… 查看全部问答∨ |
|
版主---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 改正了此错 ...… 查看全部问答∨ |