hi 先上图 表达我们小哥的设计思路。
RS485-5是独立的 利用USART3即可(比较简单)
RS485-1 2 3 4这4路是挂在一个“开关”上的,这个开关可以在4路中pick1路导通。
74LV4052相当于一个双刀四掷开关,具体接通哪一通道,由输入地址码AB来决定 这个器件用到4个管脚,TX RX就是STM32的USART2,而另外2个就是普通IO即可,我通过设置0和1就可以出现00/01/10/11这样4中情况,这样4中情况分别对应右边4路RS485的某一路导通。
- void RS485_1234_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*1号*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*2号*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*3号*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*4号*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*S0*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*S1*/
-
- }
- void Choise_RS485_1234(u8 num)
- {
- switch(num)
- {
- case 1:SW_S0_L();SW_S1_L(); break;
- case 2:SW_S0_H();SW_S1_L(); break;
- case 3:SW_S0_L();SW_S1_H(); break;
- case 4:SW_S0_H();SW_S1_H(); break;
- default :break;
- }
- }
- void TS_74LV4052_Init(void)
- {
- USART_Config(2, 9600, USART_WordLength_8b, USART_Parity_No, 2, 0, ENABLE, DISABLE);/*USART2*/
- RS485_1234_Init();
- }
- void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)
- {
- Choise_RS485_1234(num);
- USART_GetFlagStatus(USART2,USART_FLAG_TC);
- if(Len)
- {
- TS_74LV4052_On();
- USART_SendData(USART2, 0xFE);
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;
- USART_SendData(USART2, 0xFE);
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;
- USART_SendData(USART2, 0xFE);
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;
- USART_SendData(USART2, 0xFE);
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;
- while(Len--)
- {
- USART_SendData(USART2, *(Msg++));
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
- }
- TS_74LV4052_Off();
- }
- }
复制代码- #define SW_S0_H() GPIO_SetBits(GPIOG ,GPIO_Pin_14)
- #define SW_S0_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_14)
- #define SW_S1_H() GPIO_SetBits(GPIOG ,GPIO_Pin_13)
- #define SW_S1_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_13)
- #define RS485_1DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_8)
- #define RS485_1DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_8)
- #define RS485_2DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_9)
- #define RS485_2DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_9)
- #define RS485_3DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_10)
- #define RS485_3DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_10)
- #define RS485_4DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_11)
- #define RS485_4DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_11)
- #define TS_74LV4052_On() RS485_1DET_ON;RS485_2DET_ON;RS485_3DET_ON;RS485_4DET_ON
- #define TS_74LV4052_Off() RS485_1DET_OFF;RS485_2DET_OFF;RS485_3DET_OFF;RS485_4DET_OFF
复制代码 先初始化:void TS_74LV4052_Init(void)
然后就可以去愉快的发消息了void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)
实际测试发送是比较简单的,但是接受注定有麻烦了,一个时间点只能一路的通的。。。即使轮训也挺难实现。
可能需要在做设计了。有没有方便的1拖4思路呀。
|
他这是一个板子的 不是多个不同的设备 共用一路的话 所有的数据都到了四个接口上
这个板子是做工装测试的 这个板子同时接连5个设备同时测试
待测设备支持485接口(没有协议 也没有功能 就是设备也预留了接口) 所以我们也调试一下
给我的启发是 是不是可以考虑485组网