DSP+W5500移植教程

Home / 博客 / DSP+W5500移植教程

 

 

 

 

以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是存储偏移地址的变量