CC2652RB硬件SPI驱动W5100S网卡进行回环测试
1. W5100S
1.1 简介
W5100S 是一款多功能的单芯片网络接口芯片,内部集成全硬件的TCP/IP协议栈,以太网MAC和 10Base-T/100Base-TX以太网控制器。主要应用于高集成、高稳定、高性能和低成本的嵌入式系统中。 使用W5100S,用户MCU可以方便的处理IPv4,TCP,UDP,ICMP,IGMP,ARP,PPPoE等各种TCP/IP协议。W5100S分别拥有8KB的发送缓存和接收缓存,可以最大限度地减少MCU的开销。 主机还可以同时使用W5100S的4个独立的硬件SOCKETs,并基于每个硬件SOCKET开发独立的互联网应用。
W5100S支持SPI接口和并行系统总线接口。 它还提供低功耗/低热量设计,WOL(Wake On LAN),以太网PHY掉电模式等。
W5100S是基于W5100改进的低成本网络接口芯片。W5100使用的任何固件及程序都可以直接在W5100S上使用,无需任何修改。 此外,W5100S采用48引脚LQFP和QFN无铅封装,明显小于W5100的80引脚封装,方便产品小型化
1.2 W5100S与W5100、W5500的区别
型号参数 | W5500 | W5100 | W5100S |
---|---|---|---|
内部架构 | 全硬件TCP / IP协议栈+ MAC + PHY | 全硬件TCP / IP协议栈+ MAC + PHY | 全硬件TCP / IP协议栈+ MAC + PHY |
交互接口 | SPI | SPI,8bit bus | SPI,间接总线 |
SOCKET数 | 8 | 4 | 4 |
收发缓存 | 32KB | 16KB | 16KB |
MAX速率(Mbps) | 16 | 25 | 25 |
Sleep mode | O | X | X |
Hybrid mode | O | O | O |
工作温度 | -40℃ ~ 80℃ | -40℃ ~ 80℃ | -40℃ ~ 80℃ |
工作电压 | 3.3V/5V | 3.3V/5V | 3,3V/5V |
性能转换 | 不支持极性自动转换 | 支持极性自动转换 | 支持极性自动转换 |
支持的全硬件TCP\IP协议 | TCP、UDP、IP、ICMP、MAC、IGMP、PPPoE、Ethernet MAC | TCP、UDP、IP、ICMP、MAC、IGMP、PPPoE、Ethernet MAC | TCP、UDP、IP、ICMP、MAC、IGMP、PPPoE、WOL |
封装工艺 | LQFP48 无铅封装(7x7mm,间距 0.5mm) | LQFP80 无铅封装 | 48 管脚 LQFP 封装和 QFN 封装 (无铅,7x7mm, 0.5mm 间距) |
2. W5100S网卡的TCP-Client回环测试
2.1 CC2652RB硬件SPI的介绍
使用 CC2652RB 的 SDK 开发包提供的例程 ( spimaster ) 加以修改来驱动 W5100S 网卡.
SDK里已经把它所有外设的驱动都封装成库,只要按照 <ti/drivers/SPI.h> 文件中提供的说明,按顺序调用对应的API即可使用,例如:
/*!****************************************************************************** @file SPI.h** @brief Serial Peripheral Interface (SPI) Driver Interface** @anchor ti_drivers_SPI_Overview* # Overview* The Serial Peripheral Interface (SPI) driver is a generic, full-duplex* driver that transmits and receives data on a SPI bus. SPI is sometimes* called SSI (Synchronous Serial Interface).* The SPI protocol defines the format of a data transfer over the SPI bus,* but it leaves flow control, data formatting, and handshaking mechanisms* to higher-level software layers.** The SPI driver operates on some key definitions and assumptions:* - The driver operates transparently from the chip select. Some SPI* controllers feature a hardware chip select to assert SPI slave* peripherals. See the specific device implementations on chip* select requirements.** - The SPI protocol does not account for a built-in handshaking mechanism* and neither does this SPI driver. Therefore, when operating in* #SPI_SLAVE mode, the application must provide such a mechanism to* ensure that the SPI slave is ready for the SPI master. The SPI slave* must call #SPI_transfer() *before* the SPI master starts transmitting.* Some example application mechanisms could include:* - Timed delays on the SPI master to guarantee the SPI slave is ready* for a SPI transaction.* - A form of GPIO flow control from the slave to the SPI master to notify* the master when ready.** <hr>* @anchor ti_drivers_SPI_Usage* # Usage** To use the SPI driver to send data over the SPI bus, the application* calls the following APIs:* - SPI_init(): Initialize the SPI driver.* - SPI_Params_init(): Initialize a #SPI_Params structure with default* values. Then change the parameters from non-default values as* needed.* - SPI_open(): Open an instance of the SPI driver, passing the* initialized parameters, or NULL, and an index to the configuration to* open (detailed later).* - SPI_transfer(): Transmit/receive data. This function takes a* #SPI_Transaction argument that describes the transfer that is requested.* - SPI_close(): De-initialize the SPI instance.** @anchor ti_drivers_SPI_Synopsis* ## Synopsis* The following code example opens a SPI instance as a master SPI,* and issues a transaction.** @code* SPI_Handle spi;* SPI_Params spiParams;* SPI_Transaction spiTransaction;* uint8_t transmitBuffer[MSGSIZE];* uint8_t receiveBuffer[MSGSIZE];* bool transferOK;** SPI_init(); // Initialize the SPI driver** SPI_Params_init(&spiParams); // Initialize SPI parameters* spiParams.dataSize = 8; // 8-bit data size** spi = SPI_open(CONFIG_SPI0, &spiParams);* if (spi == NULL) {* while (1); // SPI_open() failed* }** // Fill in transmitBuffer* spiTransaction.count = MSGSIZE;* spiTransaction.txBuf = (void *)transmitBuffer;* spiTransaction.rxBuf = (void *)receiveBuffer;** transferOK = SPI_transfer(spi, &spiTransaction);* if (!transferOK) {* // Error in SPI or transfer already in progress.* while (1);* }* @endcode
这里仅贴出了一下部分,具体请到对应的 .h 文件中查阅.
2.2 初始化与W5100S连接的接口
通过 SysConfig 工具配置使用到的SPI以及一些控制引脚的IO
配置成功后,点击 FILE – Save 保存配置内容。在 utility.h 文件中配置延时函数
注释掉 utility.c 文件中配置STM32滴答定时器用来延时的函数,并在 utility.h 中使用宏定义定义延时函数
#include <unistd.h>
#define delay_s(time_s) sleep(time_s)
#define delay_us(time_us) usleep(time_us)
#define delay_ms(time_ms) usleep((time_ms * 1000))
- 在 w5100s_config.c 文件中配置复位和中断管脚
/**
*@brief 初始化W5100s的复位与中断管脚
*@param 无
*@return 无
*/
void reset_break_gpio_init(void)
{/* 请确保再此之前以调用过一次 GPIO_init(); */GPIO_setConfig(CONFIG_GPIO_SPI_SLAVE_RST, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);GPIO_setConfig(CONFIG_SPI_SLAVE_READY, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);GPIO_setCallback(CONFIG_SPI_SLAVE_READY, slaveReadyFxn);GPIO_enableInt(CONFIG_SPI_SLAVE_READY);
}/**
*@brief W5100s复位设置函数
*@param 无
*@return 无
*/
void reset_w5100s(void)
{GPIO_write(CONFIG_GPIO_SPI_SLAVE_RST, 0);delay_ms(500); //500msGPIO_write(CONFIG_GPIO_SPI_SLAVE_RST, 1);delay_s(1); //1s
}
- 配置 SPI 的读写函数及片选函数
#include "bsp_hard_spi.h"static SPI_Handle masterSpi;/* 初始化SPI */
void bsp_HardSpiInit(void)
{SPI_Params spiParams;/* Open SPI as master (default) */SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL1_PHA1;spiParams.bitRate = 4000000;masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);if (masterSpi == NULL){while (1);}else{}/* CS 引脚初始化 */GPIO_setConfig(CONFIG_GPIO_SPI_SLAVE_CS , GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
}/* 关闭SPI */
void bsp_HardSpiClose(void)
{SPI_close(masterSpi);
}/* 使用硬件SPI 发送一个字节 */
void bsp_HardSpi_SendByte(uint8_t byte)
{bool transferOK;SPI_Transaction transaction;uint8_t recByte = 0;transaction.count = 1;transaction.txBuf = (void *) &byte;transaction.rxBuf = (void *) &recByte;/* Perform SPI transfer */transferOK = SPI_transfer(masterSpi, &transaction);if (transferOK) {}else {}
}/* 使用硬件SPI 读取一个字节 */
uint8_t bsp_HardSpi_ReadByte(void)
{bool transferOK;SPI_Transaction transaction;uint8_t byte = 0;uint8_t recByte = 0;transaction.count = 1;transaction.txBuf = (void *) &byte;transaction.rxBuf = (void *) &recByte;/* Perform SPI transfer */transferOK = SPI_transfer(masterSpi, &transaction);if (transferOK) {}else {}return recByte;
}/* 失能片选 */
void bsp_W5100sCS_High(void)
{GPIO_write(CONFIG_GPIO_SPI_SLAVE_CS, 1);
}/* 使能片选 */
void bsp_W5100sCS_Low(void)
{GPIO_write(CONFIG_GPIO_SPI_SLAVE_CS, 0);
}
2.3 测试工程主函数
void *masterThread(void *arg0)
{int32_t status;
// status = sem_init(&masterSem, 0, 0);
// if (status != 0) {// Display_printf(display, 0, 0, "Error creating masterSem\n");
//
// while(1);
// }bsp_HardSpiInit();//W5100S 初始化reset_break_gpio_init();reg_wizchip_spi_cbfunc(bsp_HardSpi_ReadByte,bsp_HardSpi_SendByte); // SPI读写数据函数映射reg_wizchip_cs_cbfunc(bsp_W5100sCS_Low,bsp_W5100sCS_High); // SPI片选控制函数映射reset_w5100s(); // W5100S硬件复位PHY_check(); // 网线检测程序set_w5100s_mac(); // 设置W5100SMAC地址set_w5100s_netinfo(); // 设置W5100S网络参数sysinit(0x55,0x55); // 初始化4个Socket的发送接收缓存大小for(;;){do_tcp_client(); // TCP 客户端数据回环测试}bsp_HardSpiClose();/* Example complete - set pins to a known state */GPIO_disableInt(CONFIG_SPI_SLAVE_READY);GPIO_setConfig(CONFIG_SPI_SLAVE_READY, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);Display_printf(display, 0, 0, "\nDone");return (NULL);
}
- 完整的工程下载,请点击 W5100S网卡的TCP-Client回环测试【资料中包含 STM32F103VET6 驱动 W5100S 的模板工程】,如果您没有积分可以留言,我单独发您。
PS:
- 使用IAR搭建CC2652RB的开发环境
- IAR FOR ARM 需要 8.50.9 及以上版本才能打开.
- 需要先安装 CC2652RB 的 SDK,且需要安装在默认位置(C:\ti).
CC2652RB硬件SPI驱动W5100S网卡进行回环测试相关推荐
- STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片
STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...
- MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动
最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...
- STM32使用硬件SPI驱动RC522门禁模块
0.前言 RC522射频门禁识别模块非常常用,某宝卖家提供的程序基本都是使用软件模拟SPI的方式进行驱动的,但是实测使用软件模拟SPI识别速率.准确性没有硬件SPI驱动时高,因此本篇博客用于记录使用S ...
- 嵌入式开发-STM32硬件SPI驱动TFT屏
嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...
- stm32硬件SPI驱动3线SPI-LCD的方法
1.基本控制原理 三线SPI LCD, 顾名思义,最少只需要3个IO控制LCD显示,如果采用硬件控制上电时序和背光,最少只需要接SCK,CS,MOSI三个引脚即可控制LCD,并且不管接不接其他引脚,控 ...
- STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈
STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈
- ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)
由于上次模拟SPI驱动TFT屏幕太慢,所以,本次采用硬件SPI来进行驱动,但是,当我直接把对应SPI接口更换时,发现TFT屏幕驱动并没有因此得到好转,依然是非常的满,然后只能从对应花点铺色,显示字符串 ...
- 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- STM32单片机基础17——使用硬件SPI驱动TFT-LCD(ST7789)
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与ST7789通信,驱动16bit TFT-LCD 屏幕. 0. 前言 学习 SPI 外设驱动LCD屏幕没有 ...
最新文章
- ADPRL - 近似动态规划和强化学习 - Note 5 - Banach Fixed Point Theorem in Dynamic Programming
- Hibernate架构概述
- php 分页 url重写 分页问题,解决千古难题,wordpress分页URL问题,wordpress给分页加链接...
- LeetCode 489. 扫地机器人(DFS)
- CCNA试验-NAT
- 多磁盘自动分区自动挂载脚本
- idea 安装 Vue 插件后没有新建Vue文件Vue component选项
- 400是什么错误_404、403、405、500 | 常见网页错误代码解析
- C向Python正确传递数组的代码
- ML--K-近邻算法
- win7时间同步出错的解决方法
- Audio Effect
- 三点共线判断方法分析
- 最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))
- 201671030116宋菲菲 词频统计软件项目报告
- 化工原理计算机辅助设计,化工原理课程设计心得体会
- 小内存堆管理算法详细解析
- Oracle——表空间、用户、权限、角色
- 处理器架构——多发射处理器技术
- 10款最佳在线地图软件介绍