以DSPF28335与W5500基于SPI通信为例:
一、特性
1、W5500特性
- 支持硬件 TCP/IP 协议:TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
- 支持 8 个独立端口(Socket)同时通讯
- 支持掉电模式
- 支持网络唤醒
- 支持高速串行外设接口(SPI 模式 0,3)
- 内部 32K 字节收发缓存
- 内嵌 10BaseT/100BaseTX 以太网物理层(PHY)
- 支持自动协商(10/100-Based 全双工/半双工)
- 不支持 IP 分片
- 3V 工作电压,I/O 信号口 5V 耐压
- LED 状态显示(全双工/半双工,网络连接,网络速度,活动状态)
- LQFP48 无铅封装(7x7mm,间距5mm)
- 嵌入式服务器
-
2、DSPF28335特性
- 基于TMS320F28335浮点DSP控制器
- 高性能的静态CMOS技术,指令周期为6.67ns,主频达150MHz
- 6通道的DMA控制器
- 8个外部中断
- 增强型外设模块:18个PWM输出,包含6个高分辨率脉宽调制模块(HRPWM)、6个事件捕获输入、2通道的正交调制模块(QEP)
- 3个32位的定时器,定时器0和定时器1用作一般的定时器,定时器0
- 接到PIE模块,定时器1接到中断INTI3、定时器2用于DSP/BIOS的片上实时系统,连接到中断INT14,如果系统不使用DSP/bios,定时器2可用于一般定时器
- 串行外设2通道CAN模块、3通道SCI模块、2个McBSP(多通道缓冲串行接口)模块、1个SPI模块、1个I2C主从兼容的串行总线接口模块
- 12位的A/D转换器具有16个转换通道、2个采样保持器、内外部参考电压、转换速度为80ns,同时支持多通道转换
- 88个可编程的复用GPIO引脚
- TI主推高性能TMS320C28x系列DSP控制器,主频高达150MHz
- 具备I2C、SPI、eCAN、ePWM等总线接口,适用于各种控制类工业设备
- 体积小、性能强、便携性高,同时适用于多种手持设备
- 符合高低温、振动要求,满足工业环境应用
-
3、引脚分配图:
- DSPF28335引脚分配图:
W5500引脚分配图:
-
4、环境:
- 软件环境:Windows xp/Windows 7/Windows 8/Windows 10
- 硬件环境:DSPF28335 、 W5500
- 开发工具:Code Composer studio 6.0.0 、 USR-TCP232-Test(调试工具)
二、步骤
1、连接DSPF28335与W5500(选择引脚)
- 首先确认W5500与DSPF28335开发板上分别需要连接的引脚
-
(1)W5500:引脚描述
-
(2)DSPF28335引脚描述:
选择好两块开发板上的引脚后,对两块开发板进行连接:
序号型号 | W5500 | DSPF28335 | 连接方式 |
1 | MISO | 54 | 从输入主输出 |
2 | MOSI | 55 | 从输出主输入 |
3 | SCK | 56 | 时钟 |
4 | CS | 57 | 片选 |
5 | 3.3v | 3.3v | 电源 |
6 | GND | GND | 地线 |
2、引脚初始化
-
(1)设置DSPF28335上所选引脚全部设置为上拉
- GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0; // Enable pull-up on GPIO54 (SPISIMOA)
- GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0; // Enable pull-up on GPIO55 (SPISOMIA)
- GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0; // Enable pull-up on GPIO56 (SPICLKA)
- GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; // Enable pull-up on GPIO57 (SPISTEA)
- (2)设置DSPF28335上所选引脚为异步输入
- GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // Asynch input GPIO54 (SPISIMOA)
- GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // Asynch input GPIO55 (SPISOMIA)
- GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // Asynch input GPIO56 (SPICLKA)
- GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO57 (SPISTEA)
- (3)配置DSPF28335上引脚的功能
- GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // 配置GPIO54引脚为SPISIMOA
- GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // 配置GPIO55引脚为SPISOMIA
- GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // 配置GPIO56引脚为SPICLKA
- GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0; // 配置GPIO57引脚为SPISTEA
-
3、SPI配置
- 根据开发板的数据手册进行配置,对每个引脚的参数进行相应的配置
- SSpiaRegs.SPICCR.bit.SPISWRESET = 0;
- SpiaRegs.SPICCR.all = 0x0047;//The SPI software resets the polarity bit
- //to 1 (sending data along the falling edge),
- //moving in and out of the 8 bit word length each time,
- //and prohibiting the SPI internal loopback (LOOKBACK) function;
- SpiaRegs.SPICTL.all = 0x0006; // Enable master mode, normal phase, // enable talk, and SPI int disabled.
- SpiaRegs.SPISTS.all = 0x0000; //溢出中断,禁止SPI中断;
- SpiaRegs.SPIBRR = 0x001F; //SPI波特率=37.5M/24=1.5MHZ;
- SpiaRegs.SPIPRI.bit.FREE = 1; //Set so breakpoints don’t disturb xmission
- SpiaRegs.SPICCR.bit.SPISWRESET = 1;
- 根据下图进行对SPI进行配置并了解每个引脚的参数:
-
(1)、配置控制寄存器
- 使SPI处于复位方式、并设为下降沿触发、设为8位字符长度
通过配置控制寄存器为选择字符长度为8位,就是0x47,转换成二进制就是0100 0111
-
(2)、配置操作寄存器
- 启用主模式、正常相位、启用对话和禁用SPI
-
(3)、配置状态寄存器
- 溢出中断,禁止SPI中断
(4)、配置波特率
根据以下公式配置波特率
-
4、W5500 的配置
- 首先设定传输缓冲区的大小,数据写入命令和写入数据长度 ,数据写入(写入1byte数据)等,再通过配置初始化IP信息并打印,初始化8个Socket, ( voidset_network(void))函数的设置,控制数据的接受与发送。
- 例:
- void IINCHIP_WRITE( uint32 addrbsb, uint8 data)
- {
- //IINCHIP_ISR_DISABLE(); // Interrupt Service Routine Disable
- IINCHIP_CSoff(); // CS=0, SPI start
- IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1
- IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2
- IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4);// Data write command and Write data length 1
- IINCHIP_SpiSendData(data); // Data write (write 1byte data)
- IINCHIP_CSon(); // CS=1, SPI end
- //IINCHIP_ISR_ENABLE(); // Interrupt Service Routine Enable
- }
-
5、数据的发送与接收
- 使用SPITXBUF和SPIRXBUF来实现
- SPITXBUF 发送读取数据
- 配置串口传输缓冲寄存器
- SPIRXBUF 接收数据
- 配置串口接收缓冲寄存器
- 在同一个函数中实现数据的发送与接收
-
6、测试:
- 在dos端进行ip地址的ping操作,若ping通了 则代表spi通信成功,反之则失败,要对程序端进行检查。
-
三、常见问题及注意事项
- 1、通过仿真器连接pc机与板子间的通信时,先创建一个.ccmxl文件(用于连接pc机与板子),选择相应的仿真器与板子的型号–>设置名字,勾选选项–>save–>Test Connection–>最后显示success表示连接成功
- 2、SPI通信不成功:首先检查DSPF28335与W5500连接是否正确、引脚是否接对,其次检查SPI、GPIO配置是否正确(可以参考数据手册)
- 3、若在运行时程序卡在数据接收的循环
- while(SpiaRegs.SPISTS.bit.INT_FLAG != 1);{}中不动时,应该检查在程序中是否使用了fifo函数,若使用则需要在使用后关闭(可以不使用fifo)
- 4、因为在本次例程中把dspf28335设置成在读取数据时,每次读8位,但发送的数据一共有16位,若读只读前8位,但有效数据在后8位,所以在写数据的时候要向左移8位(SpiaRegs.SPITXBUF = (byte << 8);),以便都到有效数据。
- 5、发送和接收应该写在一个函数中,不能写在两个函数中
- 6、SPI通信成功后,如果在发送接收时有乱码出现,是因为在recv_data_prccessing()和send_data_prccessing()中的ptr(存储偏移地址的变量),一开始是16位的,因为移位溢出,可以设置成32位,或者在移位时,进行强制类型转换(ptr =>uint32).PTR是存储偏移地址的变量