0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

调试sp3485芯片经验总结

GReq_mcu168 来源:未知 作者:胡薇 2018-06-22 14:27 次阅读

1.首先说明一下本人这次使用的STM32芯片是STM32F103RB,使用的资源是片内的USART1。

2.下面是我的电路连接图:

注:电路可以稍做修改更好,在B和A分别接下拉电阻到地和上拉电阻到5v,阻值选择为10K即可,这是为了在没有进行数据传输时保证两条数据线的状态为确定值。

做一下简单的说明:

(1)PA8是sp3485的发送/接收使能端,sp3485只能支持半双工的通信,所以这个引脚就是来控制这个芯片到底是收数据还是发数据的。

(2)在有些电路连接中,sp3485的A和B端会一个被连接一个上拉电阻到3.3V,另一个会连接一个下拉电阻到GND,这样做的目的是当本sp3485不参与通信时不会影响网络的稳定性。

3.本次调试方式

PC机——USB转232转换头——RS232/RS485双向转换头——sp3485——STM32,因为是第一次调试sp3485芯片,所以当然没有太大意,先拿电脑调试,

调试通了再看板子和板子之间的通信了。

4.本次试验的代码:

main函数:

intmain(void)

{

/*Configurethesystemclocks*/

RCC_Configuration();

/*NVICConfiguration*/

NVIC_Configuration();

/*ConfiguretheGPIOs*/

GPIO_Configuration();

/*ConfiguretheUSART1*/

USART_Configuration();

GPIO_SetBits(GPIOA,GPIO_Pin_8);//PA8是sp3485发送/接收控制端,这里先设置为发送(实现的功能就是上电之后STM32先向PC发送一个4和一个3)

delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧

USART_ClearFlag(USART1,USART_FLAG_TC);//这一句很关键,如果没有这一句这个4会发送不成功或者发送错误的,

//其实手册上讲了使能发送位后会发送一个无用的帧,所以那个帧发送完了这个

//发送完成的标志位USART_FLAG_TC当然也被置位了。

USART_SendData(USART1,4);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//上面清除了发送完成标志位,那么这里就可以等待发送完成标志位被置位来判断这一帧是否发完了

USART_SendData(USART1,3);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

while(1)

{

GPIO_ResetBits(GPIOA,GPIO_Pin_8);//现在把PA8清零,试试接收PC机发送过来的数据

delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧

USART_ClearFlag(USART1,USART_FLAG_RXNE);//既然上面开始发送之前都将发送完成标志位清零,这里也将接收完成标志位清下零,就当是一个好习惯吧

while(1)

{

if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)//判断是否有一帧数据接收完成

{

buf[j++]=USART_ReceiveData(USART1);//接收完成的话就直接放到缓存区域里

}

if(10==j)//接收完成10个之后就跳出去,不再接收了,有个意思就OK了

break;

}

j=0;//清零一下j变量,使得实验可以反复接收PC发过来的10个数据

GPIO_SetBits(GPIOA,GPIO_Pin_8);//将sp3485设置为发送数据

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

delay_ms(2);//稍稍延时一下,原因去查看sp3485的手册吧

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

{

USART_SendData(USART1,buf[i]);//将数据依次发送出去

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

}

}

}

注:在用STM32的串口做485通信的时候,发送数据的时候,检测到最后一个数据发送后的标志位已经置位,但是还不能立即失能485芯片的发送引脚,因为虽然标志位已经置位,485芯片的数据还没有完全发送出去,这个时候需要ms级别的延时,一般2个毫秒左右基本就没有问题了。

RCC设置函数:

voidRCC_Configuration(void)

{

/*RCCsystemreset(fordebugpurpose)*/

RCC_DeInit();

/*EnableHSE*/

RCC_HSEConfig(RCC_HSE_ON);

/*WaittillHSEisready*/

HSEStartUpStatus=RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)

{

/*HCLK=SYSCLK*/

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/*PCLK2=HCLK*/

RCC_PCLK2Config(RCC_HCLK_Div1);

/*PCLK1=HCLK/2*/

RCC_PCLK1Config(RCC_HCLK_Div2);

/*Flash2waitstate*/

FLASH_SetLatency(FLASH_Latency_2);

/*EnablePrefetchBuffer*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/*PLLCLK=8MHz*9=72MHz*/

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

/*EnablePLL*/

RCC_PLLCmd(ENABLE);

/*WaittillPLLisready*/

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

{

}

/*SelectPLLassystemclocksource*/

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/*WaittillPLLisusedassystemclocksource*/

while(RCC_GetSYSCLKSource()!=0x08)

{

}

}

/*EnableUSART1andGPIOAclock*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);

}

GPIO设置函数:

voidGPIO_Configuration(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

/*ConfigureUSART1Tx(PA.09)asalternatefunctionpush-pull*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

/*ConfigureUSART1Rx(PA.10)asinputfloating*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

/*ConfigurePC.asOutputpush-pull*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO_Mode_Out_PP=0x10

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO_Mode_Out_PP=0x10

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOC,&GPIO_InitStructure);

}

USART设置函数:

voidUSART_Configuration(void)

{

USART_InitTypeDefUSART_InitStructure;

USART_ClockInitTypeDefUSART_ClockInitStructure;

USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;

USART_ClockInitStructure.USART_CPOL=USART_CPOL_Low;

USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;

USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable;

/*ConfiguretheUSART1synchronousparamters*/

USART_ClockInit(USART1,&USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate=9600;

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

USART_InitStructure.USART_StopBits=USART_StopBits_1;

USART_InitStructure.USART_Parity=USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

/*ConfigureUSART1basicandasynchronousparamters*/

USART_Init(USART1,&USART_InitStructure);

/*EnableUSART1*/

USART_Cmd(USART1,ENABLE);

}

NVIC设置函数:

voidNVIC_Configuration(void)

{

#ifdefVECT_TAB_RAM

/*SettheVectorTablebaselocationat0x20000000*/

NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);

#else/*VECT_TAB_FLASH*/

/*SettheVectorTablebaselocationat0x08000000*/

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);

#endif

}

5.实验结果

不成功,找了很久的原因,首先请检查sp3485与232/485双向转换头的连接线,我得到的最终的正确的连接办法是sp3485的A连接到T/R+,而sp3485的B连接到T/R-。

更改连接顺序之后还是出现了很奇怪的现象,每次上电之后PC的串口调试助手都会接收到04 03 00,都要多一个00(十六进制),还有更奇怪的现象,当在PC机上输入十个数据,点击发送之后,返回来居然是20个数据,前10个数据是错误的,后10个才是我发送过去的数据。。。

这个现象非常奇怪,将程序反复修改,还是不能解决问题,甚至一度怀疑sp3485坏掉了,最后弄了一整天,将sp3485A和B引脚之间的120欧姆的电阻去掉,一切恢复正常了!

说明一下:我的sp3485和232/485互转器之间的距离20cm左右,所以这个距离应该是不用接120欧姆的匹配电阻的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2270

    文章

    10893

    浏览量

    355672

原文标题:STM32调试485(sp3485)技术总结

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SP3485的功能是什么?

    SP3485的功能是什么?
    发表于 04-12 14:59

    关于SP3485芯片供电电压问题

    想请问大家,SP3485芯片手册上写的供电电压3.3V,原子哥的板子以及网上的一些电路上也是用的3.3V,想请问如果改成5V供电,会对芯片左侧与MCU相连的接口(RO,RE-,DE,DI)造成影响吗?
    发表于 09-10 16:42

    SP3485接收数据异常问题如何解决?

    做了个DTU,尝试把现场设备的485数据给传到服务器,用的芯片SP3485。厂内测试正常,拿到现场接到现成设备的总线上,只能接收现场PLC发出的数据,接收不到从机给PLC回复的数据;板子上一共有3
    发表于 03-01 09:12

    sp3485引脚图及功能

    SP3481和SP3485器件属于符合RS-485和RS-422串行协议的+3.3V低功耗半双工收发器家族。SP3481和SP3485在引脚上兼容Sipex的
    发表于 10-27 08:47 3.7w次阅读
    <b class='flag-5'>sp3485</b>引脚图及功能

    sp3485经典应用电路

    SP3481和SP3485的驱动器输出是差分输出,满足RS-485和RS422标准。空载时输出电压的大小为0V~+3.3V。即使在差分输出连按了542负载的条件下,驱动器仍可保证输出电压大于1.5V
    发表于 10-27 09:19 2.4w次阅读
    <b class='flag-5'>sp3485</b>经典应用电路

    sp3485封装及sp3485封装尺寸

    SP3485EN是SP3485的子型号!SP3485EN属于符合RS-485和RS-422串行协议的+3.3V低功耗半双工收发器家族。SP3485EN的封装为:NSOIC,尺寸为:4.
    发表于 10-27 09:43 1.2w次阅读
    <b class='flag-5'>sp3485</b>封装及<b class='flag-5'>sp3485</b>封装尺寸

    sp3485芯片工作原理

    本文主要介绍了sp3485芯片工作原理,特点,引脚图及其功能,驱动器,接收器,SP3481的关断模式,真值表以及时序逻辑图。SP3481可以工作在关断模式。要使能关断模式,驱动器和接收
    发表于 01-17 15:39 5.1w次阅读
    <b class='flag-5'>sp3485</b><b class='flag-5'>芯片</b>工作原理

    STM32调试SP3485技术总结

    本文主要对STM32调试SP3485技术总结。使用的STM32芯片是STM32F103RB,使用的资源是片内的USART1。SP3485是一
    发表于 01-17 15:56 1.8w次阅读
    STM32<b class='flag-5'>调试</b><b class='flag-5'>SP3485</b>技术<b class='flag-5'>总结</b>

    sp3485推荐电路(几款收发芯片sp3485电路)

    本文主要介绍了sp3485推荐电路(几款收发芯片sp3485电路)。SP3481和SP3485的驱动器输出是差分输出,空载时输出电压的大小为
    发表于 01-17 16:21 25.7w次阅读
    <b class='flag-5'>sp3485</b>推荐电路(几款收发<b class='flag-5'>芯片</b><b class='flag-5'>sp3485</b>电路)

    sp3485功能及作用

    本文主要介绍了sp3485功能及作用。SP3481和SP3485收发器的数据传输速率可高达10Mbps。驱动器输出最大250mAISC的限制使SP3481和
    发表于 01-17 17:03 6.9w次阅读
    <b class='flag-5'>sp3485</b>功能及作用

    EXAR品牌RS485通讯收发芯片SP3485

    工业标准8、支持短路保护 SP3485的功能框图:SP3485的封装图:SP3485的订购信息 桑尼奇科技专业代理经销多种接口芯片,涉及有RS485\RS232\USB等转换
    发表于 07-05 11:10 4054次阅读
    EXAR品牌RS485通讯收发<b class='flag-5'>芯片</b>:<b class='flag-5'>SP3485</b>

    SP3481和SP3485半双工收发器的数据手册免费下载

    SP3481和SP3485是满足RS-485和RS-422串行协议规格的+3.3V低功耗半双工收发器系列。这些设备是与SIPEX SP481、SP483和
    发表于 07-31 17:49 43次下载
    <b class='flag-5'>SP</b>3481和<b class='flag-5'>SP3485</b>半双工收发器的数据手册免费下载

    STM32调试485(sp3485)技术总结资料下载

    电子发烧友网为你提供STM32调试485(sp3485)技术总结资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-07 08:47 37次下载
    STM32<b class='flag-5'>调试</b>485(<b class='flag-5'>sp3485</b>)技术<b class='flag-5'>总结</b>资料下载

    sp3485电路设计

    目录1.sp3485驱动器2.sp3485接收器3.SP3481的关断模式4.sp3485推荐电路5.sp3485sp3485 通信自动收发
    发表于 11-05 17:50 77次下载
    <b class='flag-5'>sp3485</b>电路设计

    SP3481/SP3485收发器英文手册

      SP3481和SP3485是+3.3V低功率半双工收发器系列符合RS-485和RS-422串行协议的规格。这些设备与Sipex SP481、SP483和
    发表于 09-29 11:48 5次下载