遇到了一个单片机上电不工作的问题,仔细检查过电源、地、复位电路后,原因锁定到时钟电路上。
单片机外接晶体振荡电路的连接参见下图::
出于成本考虑,一般在用的时候会省去反馈电阻Rf和幅度衰减电阻R1。
其中, Rf为反馈电阻,其作用是稳定输出幅度和相位,其取值为200K~1Mohm;
R1为驱动限流电阻,限制反向放大器输出幅度,同时起到抑制EMI的作用。该电阻可以不使用,但当芯片输出功率较大时,或是振荡频率较高时,建议使用该限流电阻,以防止晶体被过驱动;该电阻不能太大,其阻值应与C2电容的电抗值(在振荡频率下)相当。
C1,C2为负载电容。
这次的问题原因就是省去电阻R1造成的。
现象:
单片机上电不工作,示波器测量Xout端对地时钟幅度达到8V左右,不知道为什么这么高?
解决方法:
串接幅度衰减电阻R1 = 4.7K后,单片机上电工作正常了。
不过,示波器在Xout端测量不到时钟波形了,衰减太大了?
结论:
做工合格的晶体,一般不会有这样的问题。
可是如果选到了质量一般的晶体,就会有上面的问题。
所以,建议电路还是按上面的连接来。
AVTP定义了一种打包格式,对象是各种各样的audio和video format及control信息。 AVTP是multicast协议,即一个talker(data source)提供信息给一个或多个listeners(data sink)。
IEEE1722a也定义了format用于field bus系统。
为了限制在Ethernet网络中的非要求 multicast交易的forwarding, AVTP package(典型的)放到VLAN tagged Ethernet package。
IEEE 802.1Q提供了一种机制 ,可以将neiwork分割成不同的broadcast domains。 GW系统所用的分类机制限于位于802.1Q Ethernet frames中的AVTP。
1722 sub format package用于传输Non Time-Synchronous Control Stream packages。不支持presentation time。Field bus可以是CAN messages。 NTSCF package被要求用于交换CAN messages通过GW系统,不需要CPU干预。 CAN agent用CAN-ACF容器与GW系统交换CAN messages。
测试中需要测试7个网卡,独立收、发802.1q的帧。
不限(目前在Ubuntu 14.04上实现,windows上没有实现)
目前实现的配置:
Ubuntu 14.04+Pycharm Community 2016.1+Python 2.7.6+scapy 2.3.2。 经过一番折腾,终于有结果了。过程很曲折,记录下来,以备以后翻阅。
网上查阅,发现scapy可以实现通过网卡收、发帧,需要基于python。
开始是在windows 7上,Eclipse+PyDev,运行时提示:IPv6不支持,而且发现用scapy无法实现收发802.1q的帧。
经过网上查阅,发现该问题从2012年就有人提交了问题,scapy在windows下目前不支持ip v6的相关操作(后来的实现也没有用到ipv6,而是用的ipv4)。
以后预计在scapy 3.0后会修改,会支持windows 10以后版本,windows 7不支持。
不过,不能收发802.1q帧的问题重点其实不在这里,而是windows不支持直接操作网卡。 所以,只好转到Ubuntu。
转Ubuntu,第一想法是用虚拟机,我采用了virtualBox虚拟机,安装了Ubuntu14.04LTS。
终端运行python,发现版本是2.7.6,符合要求。
安装scapy。
安装pycharm。
这时,可能会提示需要安装相应版本的JDK,具体安装另见“JDK的安装”。
JDK是必需的,而且相应版本要安装正确,pycham需要JDK 8.
pycharm下编辑python程序:发送802.1Q帧
from scapy.all import *
sendp(Ether(dst='(目标网卡MAC地址)',src='(发送源网卡MAC地址)') /Dot1Q(vlan=1,id=3,prio=2,type=0x22f0))
网卡的MAC地址在windows下可以通过ping命令查到,在Ubuntu下也可以通过ping命令查询到,也可以“系统设置”-“网络”-“有线”-“硬件地址”,直接看到。
另准备一台windows PC,安装wireshark,可以监测ubuntu发出来的802.1q帧。
但是,如果再接一个网卡,我用的是UGREEN的USB2Eth网卡,问题就来了:同一时间只能有一个网卡发送成功。
经过查询,VM中同一时间只能有一个网卡“桥接”方式有效,而我需要同时连接7个网卡呢。
所以,只好抛弃VM。
幸好,有台机器是uBuntu,还安装了mate桌面(坑,找不到设置),虽然版本是12.04,经过周末2个多小时的升级过程,升级到了14.04,mate被抹掉了。
添加root用户,重启,登陆。
检查python,版本是2.7.6,够用。
安装scapy,安装JDK。
安装pycharm。
重复前面的帧发送程序,从eth0发送,另一台PC运行wireshark监测,成功。
修改前面的帧发送程序,从eth1发送,另一台PC运行wireshark监测,成功。
pycharm下编辑python程序:接收802.1Q帧
from scapy.all import *
sniff(filter="ether proto 0x8100", prn=lambda x: x.show(), count=1,timeout=20)
运行程序监测接收数据,从另一台PC运行ostinato发送802.1Q数据,发现收到的数据缺少4个VLAN tag字节(0x8100,priority,VLAN ID)。
windows下用wireshark监测数据时,曾经出现过不显示VLAN tag的问题,通过网卡的高级属性,设置“Priority and VLAN tag”为disabled,就可以显示VLAN tag。
还用这个思路,在ubuntu下不知道如何设置网卡属性。
查阅结果发现,是linux kernel把VLAN tag给stripped(移除)了,因为它认为0x8100是标准的,没有人需要该信息,可是我需要呀。
用tcpdump命令发现,监视到0x8100字样的VLAN tag存在。
终于搜到一个帖子(如下,我加了一些安装信息)提示安装pcap或pcappy,因为它们采用和tcpdump同样的方法:重建VLAN tag。
Does anyone know why scapy is unable to capture (parse?) the vlan frame, but tcpdump sees it fine?
Based on RyPeck’s answer and GuyHarris’s advice, I now have a much better workaround:
###a) Using http://sourceforge.net/projects/pylibpcap/ import pcap conf.use_pcap=True
Linux下安装pylibpcap模块
1. 安装libpcap
apt-get install libpcap-dev
2.安装python的dev版,否则安装pylibpcap出错
apt-get install python-dev
3.安装python pcap模块
下载pylibpcap-0.6.2.tar.gz并解压,执行
python setup.py install
4. 去pylibpcap-0.6.2/examples执行测试脚本
python sniff.py eth0 'port80'
###b) Using pcappy - which is can be installed with: pip install pcappy import pcappy as pcap conf.use_pcap=True
Now scapy shows the same vlan information as tcpdump, with all it's great parsing features intact!
安装setuptools
wget https://bootstrap.pypa.io/ez_setup.py -0 - | python easy_install -i https://pypi.python.org/pypi/pcappy pcappy (easy_install pcappy会出错,缺省网址变了)
运行程序准备接收,从另一台PC运行ostinato发送802.1Q数据。
带VLAN tag字节(0x8100,priority,VLAN ID)的帧数据终于被收到了,而且两个网卡都可以正常Tx & Rx了。
总结:
scapy对windows支持不好,尤其是windows7以下。
windows下很难以administrator权限操作网卡。
VM下只能有一个网卡作用于桥接方式。
需要pcap或pcappy重建被linux kernel移除的VLAN tag。
注:以下内容选自Renesas SH7269 HW(Hardware Manual,硬件手册)。
A/D转换器将模拟输入通道输入的模拟值一边和模拟基准电压进行比较一边转换为10位的数字值。此时的A/D转换绝对精度,即输入模拟值和输出数字值的偏差包含以下误差,按照下图,依次说明每个误差。但是,为了使图容易理解,将10位的A/D转换器简化为3位的A/D转换器。
是指在数字输出值从最小值(零电压)“B’0000000000”(图中是“000”)变为“B’0000000001”(图中是 “001”)时实际A/D转换特性与理想A/D转换特性的偏差 (图1(1))为。
是指在数字输出值从 “B’1111111110”(图中是 “110” )变为最大值 (满刻度电压)“B’1111111111”(图中是 “111”)时实际A/D转换特性与理想A/D转换特性的偏差 (图1(2))。
是指A/D转换器固有的偏差,表示为1/2LSB(图1(3))。
是指从零电压到满刻度电压之间的实际A/D转换特性与理想A/D转换特性的偏差 (图1(4)),但是不包含偏移误差、满刻度误差和量化误差。
注:以下内容选自Renesas SH7269 HW(Hardware Manual,硬件手册)。
注:以下内容选自Renesas SH7269 HW(Hardware Manual,硬件手册)。
在使用A/D转换器时,必须注意以下几点。
能通过待机控制寄存器设定允许或者禁止A/D转换器的运行,初始值为停止A/D转换器的运行。
能通过解除模块待机模式,使寄存器变为可存取的状态。
如果在超过以下电压的设定范围使用A/D转换模块,就会给A/D转换器的可靠性带来不良影响。
在A/D转换过程中,必须将模拟输入引脚ANn的外加电压设定在AVSS ≤ ANn ≤ AVCC的范围内 (n=0~7)。
AVCC和AVSS的输入电压必须为(PVCC-0.3V) ≤ AVCC ≤ PVCC,AVSS = VSS。
而且,在不使用A/D转换器时或者在软件待机模式中,不能将AVCC引脚和AVSS引脚置为开路。不使用时,必须将AVCC连接到电源(PVCC)并且将AVSS接地 (VSS)。
AVref引脚的基准电压范围必须为3.0V ≤ AVref ≤ AVCC。
在设定电路板时,必须尽量将数字电路和模拟电路分开,不能使数字电路的信号线和模拟电路的信号线交叉或者靠近。
否则,会因电感等引起模拟电路的误动作并且给A/D转换值带来不良影响。必须通过模拟接地(AVSS)将模拟输入信号(AN0~AN3)、模拟基准电压(AVref)、模拟电源(AVCC)必须通过模拟接地 (AVSS)和数字电路分开,并且模拟接地 (AVSS)必须和电路板上稳定的数字接地 (VSS)进行单点连接。
为了防止过大电涌等异常电压对模拟输入引脚 (AN0~AN7)的破坏,必须连接如下图所示的保护电路。
此图的电路还有RC过滤器功能,能抑制由噪声引起的误差。
图中的电路是设计例子,必须在考虑实际的使用条件的基础上决定电路常数。
模拟输入引脚的等效电路如下图所示,模拟输入引脚的规格如表1所示。
对于信号源阻抗不超过5k欧姆的输入信号,本LSI的模拟输入能保证转换精度。
这是为了在采样时间内,对A/D转换器的采样&保持电路的输入电容进行充电而制定的规格。
在传感器的输出阻抗超过5k欧姆时,可能发生充电不足并且不能保证A/D转换精度的情况。
在单通道模式中进行转换并且外接大电容的情况下,因为输入负载实际上只有3k欧姆的内部输入电阻,所以信号源阻抗可忽略不计。
但是,由于形成低通滤波器,因此可能无法跟踪大微分系数的模拟信号(例如,大于等于5mV/us)(图3)。
在转换高速模拟信号时或者在扫描模式中进行转换时,必须插入一个低阻抗的缓冲器。
由于附加电容会导致与GND的耦合,因此,如果在GND中有噪声,就可能降低绝对精度,所以AVSS等必须与电稳定的GND连接。
另外,必须注意:在安装电路板上滤波器电路不要干扰数字信号也不要充当天线。
要转移到深度待机模式时,必须将ADST位清 “0”, 禁 止A/D转换。如果本LSI在允许A/D转换的状态下变为深度待机模式,就不保证A/D的引脚状态。
如果在扫描模式和多通道模式停止后立即开始转换,就可能产生错误的转换结果。 要连续进行转换时,必须在将ADST位置 “0”后经过1个通道的A/D转换时间 (1个通道的转换时间因分频寄存器的设定而不同),然后开始转换 (ADST位为 “1”)
使用A/D转换采集按键的值,如图:
现象:
第一次上电采样值是正确的,再次采样,会出现采样值偏高的情况。
分析:
由A/D部分等效电路可知,改电路相当于一阶全响应电路,采样处电压应该如下图中的曲线2:
如果两次按键时间较短,会导致等效电容放电时间不够,会采集到较大电压值。
措施:
延长A/D采样时间。
结论:
以前见过一个利用一阶电路零状态响应的产品(给电容充电,检查电容的电压),今天自己应用,有切身体会了。