历史上的今天
今天是:2025年08月12日(星期二)
2019年08月12日 | STM32-(07):串行通信基础(164芯片)
2019-08-12 来源:eefocus
164芯片的通信
微处理器与外设交换数据的过程中可选择以下两种方式:
并行通信:数据的各个数位同时传送;
串行通信:数据按照位顺序一位一位传送;
通信制式:
在串行通信中数据是在两个站之间进行传送的,按照数据传送方向,串行通信可分为单工、半双工和全双工3中制式。

1、在单工制式下,数据只能从发送站向接收站传送。
2、在半双工制式下,数据能双向传送,但是不能同时在两个方向上传送。
3、全双工制式下,接收数据和发送数据占用不同的线路。全双工通信可以同时发送和接收。
串行通信标准有许多,下面对部分常见的串行通信标准进行简单介绍。

最简单的单工通信
1.与外设串行通信过程中,数据是一位一位依次顺序传送的 ; 而在微处理器内部,数据是并行处理和传送的。
2.当微处理器发送数据到外设时,必须要先把并行的数据转换为串行数据再传送;当微处理器接收来自外设的数据时,必须要先把接收到的串行数据转换为并行数据才能处理。
3.这种并/串之间的转换既可用硬件实I也可用软件实现。
4.以74LS164芯片为例,介绍如何用软件方法实现数据的串一并转换。(ARM与74LS164之间的串行通信)
74LS164芯片:串行输入,并行输出

引脚功能:
1.A、B:串行数据输入端。
2.Clock:时钟输入端。
3.Clear:清零端。低电平有效。
4.QA~QH:数据输出引脚。
真值表:(L低电平,H高电平,X表示任意值,↑表示上升沿)
大致可看出:当清零端为高电平,时钟输入为上升沿时,起作用,A、B有一个输入低电平,输出全为低电平。

74LS164的时钟是由ARM处理器产生,每来1个上升沿74LS164就接收1位数据。
假设要使QA~QH = 10110011,则ARM 要发送一串数据 10110011 给A、B输入端,并产生相应的时钟信号。

164内部结构(连接示意----一共有8个D触发器)

芯片简介

实验
连接示意


代码
// PA.0连接A/B,PA.1连接Clock,PB.0连接Clear
// 使得164的QA~QH输出:11000011
//----------------头文件声明--------------------
#include"stm32f10x_lib.h" //包含所有的头文件
#include //----------------函数声明-------------------- void Delay_MS(u16 dly); void RCC_Configuration(void); void GPIO_Configuration(void); #define PA1 GPIOA->BSRR #define PA0 GPIOA->BRR #define GPIOA_ODR_A (GPIOA_BASE+0x0C) #define GPIOA_IDR_A (GPIOA_BASE+0x08) #define GPIOB_ODR_A (GPIOB_BASE+0x0C) #define GPIOB_IDR_A (GPIOB_BASE+0x08) #define GPIOC_ODR_A (GPIOC_BASE+0x0C) #define GPIOC_IDR_A (GPIOC_BASE+0x08) #define GPIOD_ODR_A (GPIOD_BASE+0x0C) #define GPIOD_IDR_A (GPIOD_BASE+0x08) #define GPIOE_ODR_A (GPIOE_BASE+0x0C) #define GPIOE_IDR_A (GPIOE_BASE+0x08) #define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr&0xF0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2))) #define PAout(n) BitBand(GPIOA_ODR_A,n) #define PAin(n) BitBand(GPIOA_IDR_A,n) #define PBout(n) BitBand(GPIOB_ODR_A,n) #define PBin(n) BitBand(GPIOB_IDR_A,n) #define PCout(n) BitBand(GPIOC_ODR_A,n) #define PCin(n) BitBand(GPIOC_IDR_A,n) #define PDout(n) BitBand(GPIOD_ODR_A,n) #define PDin(n) BitBand(GPIOD_IDR_A,n) #define PEout(n) BitBand(GPIOE_ODR_A,n) #define PEin(n) BitBand(GPIOE_IDR_A,n) /******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { u8 data,i; //1、设置PA.0推挽输出,设置PA.1、PB.0推挽输出 GPIOA->CRL = 0x33; GPIOB->CRL = 0X03; //2、进行164通信 QA~QH=11000100 , PA.0=0, PA.1来一个上升沿 PBout(0) = 1; data = 0xC4; for(i=0;i<8;i++) { PAout(1) = 0; if((data&0x01)==0x01) PAout(0) = 1; else PAout(0) = 0; Delay_MS(1); PAout(1) = 1; Delay_MS(1); data=data>>1; } return(1); } /******************************************************************************* * Function Name : Delay_Ms * Description : delay 1 ms. * Input : dly (ms) * Output : None * Return : None *******************************************************************************/ void Delay_MS(u16 dly) { u16 i,j; for(i=0;i } 仿真程序运行结果
史海拾趣
|
问你们的WINCE5。0系统中控制面板都有“存储器管理”这个东西吗,我在网上看到,大家似乎都有,我的中文内核和英文内核都看不到这个啊。什么原因呢? … 查看全部问答> |
|
市面上的蓝牙适配器BTH v2.0 + EDR 宣称最大数据率可达到3Mbps 在我们项目中使用了一块CSR芯片的某小公司的蓝牙模块,下位机与之相接的UART波特率选921600bps (约92KB/s)。但在实际的数据传输中,下位机最快只能是50微秒发送一个字节(20KB/s) ...… 查看全部问答> |
|
各位大侠我都要抓狂了。用socket在Arm7开发板与PC进行通信。 Arm7端的接收PC机发来的字符串 iRecv=recvfrom(ClientSock_in, (char *)RecvData, 8, 0, (struct sockaddr*)&cliaddr_in, (int*)&fromlen); PC机端发送数据: RecvData=\" ...… 查看全部问答> |
|
在网上看到这样一句话:RS-485通信双方的地电位差要求小于1V。 我量了自己的主机和从机之间的地电位差为1.9V,是不是因为这个原因才导致无**常通信的呢?… 查看全部问答> |




