LAN8742->KSZ8041
STM32Cube配置以太网默认的PHY为LAN8742, 支持PHY地址自动搜索, 抱着试一试的态度, 虽然外部PHY是KSZ8041, 直接运行LAN8742的程序, 仍然是可以ping通的. 具体寄存器未查看.
lan8742.c
有个2000的宏定义, 每次初始化会死等2000ms, 显得初始化很慢, 可以视情况手动改小, 当然每次Cube自动生成代码又会回到2000
#define LAN8742_INIT_TO ((uint32_t)2000U)
晶振负载电容
无源晶振的负载电容不是外部焊接的电容
CL=(C1*C2)/(C1+C2)+C''
CL: 负载电容
C1 C2: 晶振两端焊接的实际电容, 一般常见 C1 = C2
C'': 线路杂散电容, 常见范围 4~6pF
可以用示波器查看是否过驱
假设无源晶振的负载电容是10pF, 考虑到电容高低温容量的变化, 常见焊接的有20pF的(2倍左右, 可以用示波器查看是否过驱适当调整), 如果直接焊10pF, 可能会碰到下面诡异的现象:
- 板子有的起振, 有的不起振
- 有的夏天能工作, 冬天不能工作
- 有的高低温试能过, 但也有概率过不了, 这种情况也有可能是复位电容随温度变化导致非正常复位了
千兆网络线序
千兆变压器因为是对称的, 为方便布线, 1 2 3 4 和 4 3 2 1 走线都可以, 但是禁止RJ45调线, 比如自己调换RJ45的4和6pin, 然后拿标准网线裁掉, 自己在另一端调线, 或者是工业M12之类出网口线, 淘宝买M12转RJ45, 然后自己调线序的, 这个时候会碰到的情况:
- 线比较短, 直接接电脑网口是千兆
sudo ethtool eth0
, 接交换机变成了百兆 - 不论怎么接都是百兆
因为线序不对, 网络对内部双绞线绞错了啊. 实在是不想改板子或订做线, 只能做的超级短, 一端M12, 另一端RJ45母座
串口
踩过的坑:
- 测试的外部晶振25M, 实际焊的是8M
- 初始无打印, TX2起来后MCU才能打印, 原因是232芯片用的TX2的电, TX2没起来, MCU初始化自然打不出来
- printf用开源的嵌入式printf实现, 或者自己实现, 或者勾选MicroLib, 不然网络里面有printf, MCU直接死机…
- 某LoRa模块串口速度一快就黏包, 刚好搞死了DMA空闲接收中断, 去掉Cube里面的
Overrun
和DMA on RX Error
, 并且程序内部处理黏包
欢迎扫描二维码关注微信公众号, 及时获取最新文章: