📄 cp2200.txt
字号:
以太网芯片CP2200应用手记
CP2200复位初始化:
1、等待复位引脚上升;
2、等待晶体初始化完成。处理器将收到复位中断请求。
3、等待自身初始化完成。INT0中断状态寄存器(30页)检测初始化是否完成。
4、屏蔽中断(用32页和35页的INT0EN和INT1EN),默认状态下每次复位后所有中断使能。
5、用44页的IOPWR寄存器使能需要的活动、链接,或活动/链接LED灯。注LINK和ACTIVITY只有48脚封装的才可独立分开。
6、初始化物理层。
7、初始化MAC控制寄存器。
8、配置接收过滤器。
9、准备发送和接收包。
中断请求信号
芯片复位时,中断使能,可能过软件关闭。未处理中断可能过读自清除寄存器进行清除。
中断产生事件:
未完成包终止;
接收缓冲空;
接收缓冲满;
晶体初始化完成;
自初始化完成;
FLASH写/擦除完成;
包发送完成;
包接收完成;
“wake-on-lan"唤醒事件;
链接状态改变;
LED使能或关闭由IOPWR寄存器控制。
发送包:将发送数据写到发送缓冲,自动写寄存器的TXGO位写1启动发送。
接收完一包,产生中断。处理器可能过自动读接口读数据包。
内部存储器的寄存器:
处理器通过并口控制直接或间接寄存器,处理器接口接供一个8位地址空间。114个可用的直接寄存器区域。所有剩余的寄存器空间保留,不可读写。直接寄存器用于存取RAM缓冲,FLASH。MAC配置寄存器和其他状态/控制寄存器用于配置芯片功能。
接收和发送RAM缓冲共享相同的地址空间,使用RAMADDRH:RAMADDRL指针存取。每个缓冲有一个数据指示寄存器。FLASH是一个独立的地址空间。
发送缓冲0x0000-0x07ff,接收缓冲0x0000-0x0fff(FLASHADDRH:FLASHADDRL指针)
随机存取RAM发送和接收缓冲:
1、写一个目标地址到RAMADDRH:RAMADDRL.
2、发送缓冲:
读写8位数据到RAMTXDATA读或写发送缓冲中的目标字节。
接收缓冲:
读或写8位数据到RAMRXDATA去读或写接收缓冲目标字节。
注:
内部寄存器:
#define CPADDRH 0x21 //当前读包地址高字节(63页)
#define CPADDRL 0x22 //当前读包地址低字节(63页)
#define CPINFOH 0x1d //当前读包信息高字节(61页)
#define CPINFOL 0x1e //当前读包信息低字节(62页)
#define CPLENH 0x1f //当前读包长度高字节(62页)
#define CPLENL 0x20 //当前读包长度低字节(62页)
#define CPTLB 0x1a //当前读包TLB数(65页)
#define FLASHADDRH x69 //FLASH地址指针高字节(74页)
#define FLASHADDRL 0x68 //FLASH地址指针低字节(74页)
#define FLASHAUTORD 0x05 //FLASH自动读 W/增量(75页)
#define FLASHDATA 0x06 //FLASH读/写数据寄存器(75页)
#define FLASHERSE 0x6a //FLASH擦除(76)
#define FLASHKEY 0x67 //FLASH锁存(74)
#define FLASHSTA 0X7B //FLASH状态(73)
#define INT0 0x63 //中断状态寄存器0(自清除)(30页)
#define INT0EN 0x64 //中断使能寄存器0(32)
#define INT0RD 0x76 //中断状态寄存器(只读)(31)
#define INT1 0x7f //中断状态寄存器1(自清除)(33)
#define INT1EN 0X7D //中断使能寄存器1(35)
#define INT1RD 0x7e //中断状态寄存器(只读34)
#define IOPWR 0x70 //端口输入输出电源(44)
#define MACADDR0x0a //MAC地址指针(78)
#define MACDATAH 0x0b //MAC数据寄存器高字节
#define MACDATAL 0x0c //MAC数据寄存器低字节
#define MACRW 0x0d //MAC读写开始(78)
#define OSCPWR 0x7c //晶体电源(44)
#define PHYCF 0x79 //物理层配置(90)
#define PHYCN 0x78 //物理层控制(89)
#define PHYSTA 0x80 //物理层状态(91)
#define RAMADDRH 0x08 //RAM地址指针高字节(23)
#define RAMADDRL 0x09 //RAM地址指针低字节(23)
#define RAMRXDATA 0x02 //RXFIFO RAM数据寄存器(23)
#define RAMTXDATA 0x04 //TXBUFF RAM数据寄存器(23)
#define RSTEN 0x72 //复位使能寄存器(410
#define RXAUTORD 0x01 //RXFIFO 自动读 W/增量(60)
#define RXCN 0x11 //读控制(59)
#define RXFIFOHEADH 0x17 //读缓冲头指针高字节(69)
#define RXFIFOHEADL 0x18 //读缓冲头指针低字节(69)
#define RXFIFOSTA 0x5b //读缓冲状态(70)
#define RXFIFOTAILH 0x15 //读缓冲尾部高字节(69)
#define RXFIFOTAILL 0x16 //读缓冲尾部低字节(69)
#define RXFILT 0x10 //读过滤器配置(60)
#define RXHASHH 0x0e //接收HASH 表高字节(60)
#define RXHASHL 0x0f //接收HASH表低字节(61)
#define RXSTA 0x12 //接收状态(59)
#define SWRST 0x75 //软件复位寄存器
#define TLB0ADDRH 0x27 //TLB0地址高字节
#define TLB0ADDRL 0x28 //TLB0地址低字节
#define TLB0INFOH 0x23 //TLB0信息地址高字节
#define TLB0INFOL 0x24 //TLB0信息地址低字节
#define TLB0LENH 0x25 //TLB0长度高字节
#define TLB0LENL 0x26 //TLB0长度低字节
#define TLB1ADDRH 0x2D //TLB1地址高字节
#define TLB1ADDRL 0x2E //TLB1地址低字节
#define TLB1INFOH 0x29 //TLB1信息地址高字节
#define TLB1INFOL 0x2A //TLB1信息地址低字节
#define TLB1LENH 0x2b //TLB1长度高字节
#define TLB1LENL 0x2C //TLB1长度低字节
#define TLB2ADDRH 0x33 //TLB2地址高字节
#define TLB2ADDRL 0x34 //TLB2地址低字节
#define TLB2INFOH 0x2F //TLB2信息地址高字节
#define TLB2INFOL 0x30 //TLB2信息地址低字节
#define TLB2LENH 0x31 //TLB2长度高字节
#define TLB2LENL 0x32 //TLB2长度低字节
#define TLB3ADDRH 0x39 //TLB3地址高字节
#define TLB3ADDRL 0x3A //TLB3地址低字节
#define TLB3INFOH 0x35 //TLB3信息地址高字节
#define TLB3INFOL 0x36 //TLB3信息地址低字节
#define TLB3LENH 0x37 //TLB3长度高字节
#define TLB3LENL 0x38 //TLB3长度低字节
#define TLB4ADDRH 0x3F //TLB4地址高字节
#define TLB4ADDRL 0x40 //TLB4地址低字节
#define TLB4INFOH 0x3B //TLB4信息地址高字节
#define TLB4INFOL 0x3C //TLB4信息地址低字节
#define TLB4LENH 0x3D //TLB4长度高字节
#define TLB4LENL 0x3E //TLB4长度低字节
#define TLB5ADDRH 0x45 //TLB5地址高字节
#define TLB5ADDRL 0x46 //TLB5地址低字节
#define TLB5INFOH 0x41 //TLB5信息地址高字节
#define TLB5INFOL 0x42 //TLB5信息地址低字节
#define TLB5LENH 0x43 //TLB5长度高字节
#define TLB5LENL 0x44 //TLB5长度低字节
#define TLB6ADDRH 0x4B //TLB6地址高字节
#define TLB6ADDRL 0x4C //TLB6地址低字节
#define TLB6INFOH 0x47 //TLB6信息地址高字节
#define TLB6INFOL 0x48 //TLB6信息地址低字节
#define TLB6LENH 0x49 //TLB6长度高字节
#define TLB6LENL 0x4A //TLB6长度低字节
#define TLB7ADDRH 0x51 //TLB7地址高字节
#define TLB7ADDRL 0x52 //TLB7地址低字节
#define TLB7INFOH 0x4D //TLB7信息地址高字节
#define TLB7INFOL 0x4E //TLB7信息地址低字节
#define TLB7LENH 0x4F //TLB7长度高字节
#define TLB7LENL 0x50 //TLB7长度低字节
#define TLBVALID 0x1C //TLB可用指示器
#define TXAUTOWR 0x03 //发送数据自动写
#define TXBUSY 0x54 //发送忙批示
#define TXCN 0x53 //发送控制
#define TXENDH 0x57 //发送数据结束地址高字节
#define TXENDL 0x58 //发送数据结束地址低字节
#define TXPAUSEH 0x55 //发送数据终止高字节
#define TXPAUSEL 0x56 //发送数据终止低字节
#define TXSTA0 0x62 //发送状态向量0
#define TXSTA1 0x61 //发送状态向量1
#define TXSTA2 0x60 //发送状态向量2
#define TXSTA3 0x5F //发送状态向量3
#define TXSTA4 0x5E //发送状态向量4
#define TXSTA5 0x5D //发送状态向量5
#define TXSTA6 0x5C //发送状态向量6
#define TXSTARTH 0x59 //发送数据开始地址高字节
#define TXSTARTL 0x5A //发送数据开始地址低字节
#define VDMCN 0x13 //VDD监视控制寄存器
INT0.7 包结束--使用自动读接口,接收包的最后一个字节被读取
INT0.6 接收缓冲空--接收缓冲区中的最后一个包被卸载或丢弃.
INT0.5 芯片准备复位初始化
INT0.4 外部晶体已经稳定工作
INT0.3 一个FLASH写或擦除操作完成
INT0.2 发送接口完成一个发送包
INT0.1 接收缓冲满或达接收包的最大数.检测RXFIFOSTA状态寄存器了解接收缓冲状态
INT0.0 一个包被加到接收缓冲(接收到一个包)
INT1.5 设备连接到网络
INT1.4 设备已经连接到网络或断开
INT1.3 发送接口检测到和回应一个不清状况
INT1.2 自动协商失败.软件应当检测可用连接和得试自动协商auto-negotiation.
INT1.1 远程错误通知--远程错误(电缆或连接失败)被检测到.
INT1.0 auto-negotiation尝试完成,
复位源:
复位事件发生时:
所有直接和间接寄存器值初始化到复位值.
数字引脚(除/RST外)强制为高阻状态(弱上拉到VDD)
模拟引脚(除TX+/TX-,RX+,RX-外)强制为高阻状态,没弱上拉
外部晶体停振同时/RST驱动低(除软件复位外)
所有中断使能.
电压监控寄存器VDMCN
VDMEN(7)--监控使能(用于使能和关闭VDD监控电路)
VDDSTAT(6)--VDD状态
软件复位:写1到SWRST的2位(RESET)强制进入复位状态
判断最后的复位源:RSTSTA寄存器.如果PORSI位设置为1,所有其他的RSTSTA将不定义.
SWRSI(2)--软件复位标志位.
PORSI(1)--上电,电源掉电,晶体停振复位标志位.
PINRSI--外部引脚复位.
RSTEN寄存器:
ESWRST(2)使能软件复位
EPFRST(1)电源掉电复位使能
电源管理模式:
正常模式(全速运行)
连接检测模式(发关关闭)
寄存器模式(发送和接收关闭)
掉电模式(晶体输出关闭)
通过将PHYCN(6)的TXEN清0,芯片由正常模式转为连接检测模式.通过PHYCN=00关闭物理层,然后重新使能物理层返回正常模式.
将PHYCN的相应三个位设为000进入寄存器模式,通过将这三位设为111返回正常模式.
掉电模式下只能通过上电或引脚复位进入正常模式
进入掉电模式步骤:
1、关闭PHY(清除PHYCN的相应000)
2、清除IOPWR的2,3位00关闭LED驱动
3、将VDMEN(VDMCN.7)设为0关闭电源监控
4、OSCOE(OSCPWR.0)设为0关闭晶体输出。
发送界面:
以太网帧格式:
引导符和开始帧分隔符(8字节)->目标MAC地址(6字节)->源MAC地址(6字节)->第度/类型(2字节)->数据(46到1500字节)->CRC检测(4字节)
发送包步骤:
1、检测TXBUSY是否为00(空闲)
2、确定没忽略最后的发送包。如果TXSTA3寄存器的3-7为1,表示忽略了最后发送包。如果忽略了发送包,使用下面的步骤清楚忽略状态(注:添加任何包之前必须清除忽略状态)
A、设置TXSTARTH:TXSTARTL为0000。
B、设置TXENDH:TXENDL为0x0040.
C、写0x81到TXCN
D、检测TXBUSY是否空闲。
E、设置TXCN为0x00
F、再次检测忽略包。忽略包仅在半双工模式和过重的网络负荷下出现。
3、设置TXSTARTH:TXSTARTL发送缓冲指针为0x0000
4、通过写数据到TXQUTOWR装载数据到发送缓冲(第次写一个字节)
5、设置TXSTARTH:TXSTARTL发送缓冲指针为0x0000.
6、写1到TXGO(TXCN的0位)启动发送。
发送缓冲和自动写界面:
发送状态和控制寄存器:
TXCN:
OVRRIDE(7)--为0时TXCN的5,4,3,2,1位将无效。MAC设置有影响;为1。TXCN的5,4,3,2,1有用,MAC设置不考虑
CRCENOV(5)--CRC使能。
PADENOV(4)--
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -