关于单片机串口转并口芯片74HC165的编程问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于单片机串口转并口芯片74HC165的编程问题。相关的知识,希望对你有一定的参考价值。

问题很致命,编译没有报错。但是无法实现,不知道哪里出了问题。我要实现并转串口,用8*2独立按键去控制LED灯亮。但是我把P0插入了LED灯组的时候,却只有倒数的两个LED在亮。独立按键怎么按都没有反应。#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器#include "intrins.h"typedef unsigned char u8;typedef unsigned int u16;#define GPI0_LED P0 //断点数据P0口发送sbit IN_PL=P1^6;sbit IN_DATA=P1^7;sbit sck=P3^6;u8 read74hc165() u8 indata; u8 i; IN_PL=0; //为了造成上升沿而初步做的初始零单位。 _nop_(); //延时一个nop,一个晶震周期。 IN_PL=1; //上升沿 _nop_(); for(i=0;i<8;i++) indata=indata<<1; //更改indata的位,必须放在前面。因为放在后面会使得已经或运算好的值被移动走。读函数放前,写函数放后。 sck=0; _nop_(); indata|=IN_DATA; //将串口里面的数据通过或运算给indata sck=1; return indata;void main() u8 h165value; GPI0_LED=0; while(1) h165value=read74hc165(); if(h165value!=0xff) //有上拉电阻,默认接口为1. GPI0_LED=~h165value;

关于单片机串口转并口芯片74HC165的编程问题。
看你的原理图,只有8个独立按键,并不是你说的8×2个。而且按键的编号K1~K8的顺序是乱的,与74HC165输入引脚顺序不相符。就不知道实物开发板是不是也这样的。
参考技术A 你好 我刚开始学这个 看的视频中 程序与你的一致 但是最后移位中for循环里的那个或运算不能理解,能帮忙解释下吗? 参考技术B 可以帮你做出来 参考技术C 。??!????

CH432,CH438,CH9434串口扩展芯片常见问题

目前WCH有三款串口扩展芯片CH432,CH438以及CH9434。

 

型号

CH432

CH438

CH9434

扩展串口数量

2

8

4

通讯接口

并口/SPI(具体需要看芯片封装)

并口

SPI

接口速度

支持最高

10MB的并口

 24MHz的SPI

 10MB的8位并口

 

最高16Mbit/s

注1:见表格底 

是否支持级联

FIFO大小

内置 16 字节的 FIFO 先进先出缓冲器,支持 4 个 FIFO 触发级

内置 128 字节的 FIFO 先进先出缓冲器,支持 4 个 FIFO 触发级

串口每个方向独立 FIFO 缓存,发送 1536 字节,接收 2048 字节

封装

CH432Q(LQFP44)

CH432T(SSOP20)

CH438L(LQFP128)

CH438Q(LQFP44)

QFN48_5X5

电源

3.3V-5.3V

(5V典型值)

3.3V-5.3V

(5V典型值)

2.4V-3.6V

(3.3V典型值)

 

注1:CH9434的SPI最快时钟速度与CH9434的系统时钟有关系。最快速度(稳定)约为系统时钟的1/3。Eg:如果使用内部32M,倍频15,分频15.那么sys_clk还是32M,那么SPI_Clk不能超过10Mbit/s。

常见问题解决

1. CH432/8/CH9434的LSR寄存器进入break。

解答:这个是因为串口的RXD脚一直处于低电平导致的,只需要硬件接上拉等方式即可解决。

2. 如何判断CH432/CH438/CH9434芯片是否正常工作

解答:(1)检查硬件,检查芯片的VCC引脚的电压是否为手册里面要求的典型值。看一下VCC的纹波是否过大。

   (2)在上电的情况,使用示波器去检查芯片的XI,看一下晶振是否有波形。

   (3)检查硬件的连接线是否有问题(主控芯片与串口扩展芯片通讯接口的连接)

   (4)通过接口发送对应的数据,往SCR寄存器写数据,再读出来看是否为刚刚写入的数据,如果是的,则表示芯片工作正常并且硬件基础的通讯连接没有问题。

    注:这三个串口扩展芯片的SCR寄存器为用户自定义的寄存器,断电复位是会保持。

3. 主控芯片与芯片通讯不正常

解答:(1)首先检查硬件的连接。

   (2)如果是SPI,检查一下SPI的CLK速度是否超过了芯片要求的最大值

   (3)部分芯片对于命令与数据,命令与命令之间是由最小时间的间隔要求,具体需要看芯片手册。可以用逻辑分析仪查看是否有这些时间间隔。

   (4)所有的SPI转串口(扩展)的芯片的时序,CS是在发送完addr和数据后,才会重新拉高的。具体可以看芯片手册的时序图。

4.有关串口扩展芯片的FIFO的问题

解答:三款串口扩展芯片的接收fifo触发点都是控制FCR寄存器的RECVTG1 和 RECVTG0位(3个芯片的大部分寄存器都是一样的)。

(1)CH432:RECVTG1 和 RECVTG0:设置接收 FIFO 的中断和硬件流控制的触发点,00 对应 1 个字节,即接收
满 1 个字节产生接收数据可用的中断,并在使能硬件流控制时自动无效 RTS 引脚,01 对应 4
个字节,10 对应 8 个字节,11 对应 14 个字节。(FIFO16字节)。

(2)CH438:RECVTG1 和 RECVTG0:设置接收 FIFO 的中断和硬件流控制的触发点,00 对应 1 个字节,即接收
满 1 个字节产生接收数据可用的中断,并在使能硬件流控制时自动无效 RTS 引脚,01 对应 16
个字节,10 对应 64 个字节,11 对应 112 个字节((FIFO128字节)

(3)CH9434M:RECVTG1 和 RECVTG0:设置接收 FIFO 的中断和硬件流控制的触发点,00 对应 256 个字节,即
接收满 256 个字节产生接收数据可用的中断,并在使能硬件流控制时自动无效 RTS 引脚,
01 对应 512 个字节,10 对应 1024 个字节,11 对应 1280 个字节。

当接收数据达到触发值时,就会触发recv_rdy(接收字节数达到fifo触发点)中断。

 

5. 对于CH43x芯片读取的问题

解答:有些新上手的工程师,在使用fifo接收的时候,会发现随着波特率的提高,当触发RECV_RDY中断的时候,去读取RBR寄存器(注1)的数据。最后读出来的数据长度会超过FIFO接收触发的长度。这个是因为目前43xEVT的代码里面,是一个do--while循环,判断的条件是看BIT_LSR_DATARDY,也就是LSR的DATARDY位是否为1(注2),为1则表示fifo里面有数据,那么如果通讯接口的速度与较慢,串口的波特率较高,并且对方串口的发送速度也较快,那么就会出现,触发fifo_recv_rdy中断后,主控芯片通过接口去读取缓冲区的数据,但如果在读取的时候来了新的数据,那么就会继续停留在这个do-while循环语句当中。最后导致的情况就是读出的数据长度明显大于fifo触发的长度,如果fifo触发值设置的较大,那么很有可能会出现fifo溢出的问题。


u8 CH432Seril1Rcv( u8 *buf ) /* 禁用FIFO,CH432串口1接收多字节子程序*/
{
u8 RcvNum = 0;
if( !( ReadCH432Data( CH432_LSR1_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) /* b1-b4无错误 */
{
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); /* 等待数据准备好 */
do
{
*buf++ = ReadCH432Data( CH432_RBR1_PORT ); /* 从接收缓冲寄存器读出数据 */
RcvNum++;
}
while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0x01 );
}
else ReadCH432Data( CH432_RBR1_PORT );
return( RcvNum );
}

解决办法就是在这个接收函数里面,如果是fifo触发的中断,则强制只读一个触发值长度的数据,如果是超时中断则调用原来的dowhile的那个方式。其次,若选择的是CH432这样的fifo较小的串口扩展芯片,那么fifo触发值最好选择一半。还有就是提高spi接口的通信的速率。

 6. 有关串口波特率的问题

解答:串口波特率的计算和DLM以及DLL两个寄存器有关。具体的计算公式:除数(DLL和DLM的值)=芯片主时钟/16or8(具体看芯片手册)/波特率。

 注1:RBR:接收缓冲寄存器,如果 LSR 的 DATARDY 位为 1 则可以从该寄存器读取接收到的数据。如果 FIFOEN
为 1 则从串口移位寄存器 RSR 接收到的数据首先被存放于接收 FIFO 中,然后通过该寄存器读出

注2:DATARDY:该位为 1 表示接收 FIFO 中有接收到的数据,读取 FIFO 中所有数据后,该位自动清 0。

以上是关于关于单片机串口转并口芯片74HC165的编程问题。的主要内容,如果未能解决你的问题,请参考以下文章

Arduino与74HC595驱动数码管

单片机用74HC165扩展的相关问题

3片74HC165级联,读取按键

17组+图文教程+Arduino中内置的ShiftIn函数与74HC165芯片的配合使用

74H165原理到底是怎样的?

单片机芯片之(74HC595/74LS595)