你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
toofree 发表于 2017-4-5 14:44 你这个应该用上升沿或下降沿读取吧,你用电平肯定不行呀,而且中间没有延时,循环太快太快了。你循环结束 ...
查看全部评分
wenyangzeng 发表于 2017-4-5 14:53 按照你例程每接收1个bit延时1毫秒,接收1个字节就需要8毫秒,怎么受得了?如果不可靠,顶多在时钟沿到来之 ...
按照你例程每接收1个bit延时1毫秒,接收1个字节就需要8毫秒,怎么受得了?如果不可靠,顶多在时钟沿到来之后加1-2个NOP足够矣。
纳秒级的呀:
曾做过测试,使用电平方式特别容易受干扰,而是用上升沿/下降沿触发方式则可靠得多
评分
查看全部评分
不好意,看错了。以为是楼主的帖子,被程序给误导了。
#include "delay.h"
#include "485test.h"
unsigned int ADDR_SW_Data,HC=0;
void ADDR_SW_Init(void)//74HC165D各引脚初始化
{
GPIO_InitTypeDef ADDR_SW_GPIO_InitStructure;
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //
/* Configure zoom and focus pins in output pushpull mode */
ADDR_SW_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;//0:clock;1
GPIO_SetBits(GPIOC, GPIO_Pin_0);//clock
GPIO_SetBits(GPIOC, GPIO_Pin_1);//PL
GPIO_SetBits(GPIOC, GPIO_Pin_2);//clock_en
ADDR_SW_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
ADDR_SW_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOC, &ADDR_SW_GPIO_InitStructure);
/* Configure SPI1 pins: MISO and MOSI */
ADDR_SW_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//DATA_OUT
ADDR_SW_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOC, &ADDR_SW_GPIO_InitStructure);
}
void read_ADDR_SW(void)//读取74HC165D函数值
{
unsigned char i;
ADDR_SW_Data = 0;
GPIO_ResetBits(GPIOC, GPIO_Pin_2);//clock_en //打开165选通端
GPIO_ResetBits(GPIOC, GPIO_Pin_1); //运行数据计入165
delay_ms(1);
GPIO_SetBits(GPIOC, GPIO_Pin_1); //允许数据移位
for(i=0;i<16;i++) //读16次数据
{
GPIO_ResetBits(GPIOC, GPIO_Pin_0);
delay_ms(1);
ADDR_SW_Data = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) | (ADDR_SW_Data<<1);
GPIO_SetBits(GPIOC, GPIO_Pin_0);
delay_ms(1);
}
GPIO_SetBits(GPIOC, GPIO_Pin_2); //关闭165选通端
GPIO_ResetBits(GPIOC, GPIO_Pin_1); //运行数据计入165
ADDR_SW_Data = ~ADDR_SW_Data; //拨码开关取反
//PT_currentaddr = ADDR_SW_Data & 0x00ff; //拨码开关低8位为地址
switch((ADDR_SW_Data >> 8) & 0x0003) //拨码开关高8位为波特率设置,低2位为波特率设置位
{
case 0x0000 :
{
//current_BautRate = 2400;
USART_SendData(USART1, 1);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
break ;
}
case 0x0001 :
{
//current_BautRate = 4800;
USART_SendData(USART1, 2);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
break ;
}
case 0x0002 :
{
//current_BautRate = 9600;
USART_SendData(USART1,3);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
break ;
}
case 0x0003 :
{
//current_BautRate = 19200;
USART_SendData(USART1, 4);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
break ;
}
default :
//current_BautRate = 2400;
{USART_SendData(USART1, 1);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
}
break ;
}
}
评分
查看全部评分