日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CC2652RB硬件SPI驱动W5100S网卡进行回环测试

發(fā)布時(shí)間:2023/12/29 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CC2652RB硬件SPI驱动W5100S网卡进行回环测试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. W5100S

1.1 簡介

W5100S 是一款多功能的單芯片網(wǎng)絡(luò)接口芯片,內(nèi)部集成全硬件的TCP/IP協(xié)議棧,以太網(wǎng)MAC和 10Base-T/100Base-TX以太網(wǎng)控制器。主要應(yīng)用于高集成、高穩(wěn)定、高性能和低成本的嵌入式系統(tǒng)中。 使用W5100S,用戶MCU可以方便的處理IPv4,TCP,UDP,ICMP,IGMP,ARP,PPPoE等各種TCP/IP協(xié)議。W5100S分別擁有8KB的發(fā)送緩存和接收緩存,可以最大限度地減少M(fèi)CU的開銷。 主機(jī)還可以同時(shí)使用W5100S的4個(gè)獨(dú)立的硬件SOCKETs,并基于每個(gè)硬件SOCKET開發(fā)獨(dú)立的互聯(lián)網(wǎng)應(yīng)用。

W5100S支持SPI接口和并行系統(tǒng)總線接口。 它還提供低功耗/低熱量設(shè)計(jì),WOL(Wake On LAN),以太網(wǎng)PHY掉電模式等。

W5100S是基于W5100改進(jìn)的低成本網(wǎng)絡(luò)接口芯片。W5100使用的任何固件及程序都可以直接在W5100S上使用,無需任何修改。 此外,W5100S采用48引腳LQFP和QFN無鉛封裝,明顯小于W5100的80引腳封裝,方便產(chǎn)品小型化

1.2 W5100S與W5100、W5500的區(qū)別

型號(hào)參數(shù)W5500W5100W5100S
內(nèi)部架構(gòu)全硬件TCP / IP協(xié)議棧+ MAC + PHY全硬件TCP / IP協(xié)議棧+ MAC + PHY全硬件TCP / IP協(xié)議棧+ MAC + PHY
交互接口SPISPI,8bit busSPI,間接總線
SOCKET數(shù)844
收發(fā)緩存32KB16KB16KB
MAX速率(Mbps)162525
Sleep modeOXX
Hybrid modeOOO
工作溫度-40℃ ~ 80℃-40℃ ~ 80℃-40℃ ~ 80℃
工作電壓3.3V/5V3.3V/5V3,3V/5V
性能轉(zhuǎn)換不支持極性自動(dòng)轉(zhuǎn)換支持極性自動(dòng)轉(zhuǎn)換支持極性自動(dòng)轉(zhuǎn)換
支持的全硬件TCP\IP協(xié)議TCP、UDP、IP、ICMP、MAC、IGMP、PPPoE、Ethernet MACTCP、UDP、IP、ICMP、MAC、IGMP、PPPoE、Ethernet MACTCP、UDP、IP、ICMP、MAC、IGMP、PPPoE、WOL
封裝工藝LQFP48 無鉛封裝(7x7mm,間距 0.5mm)LQFP80 無鉛封裝48 管腳 LQFP 封裝和 QFN 封裝 (無鉛,7x7mm, 0.5mm 間距)

2. W5100S網(wǎng)卡的TCP-Client回環(huán)測試

2.1 CC2652RB硬件SPI的介紹

使用 CC2652RB 的 SDK 開發(fā)包提供的例程 ( spimaster ) 加以修改來驅(qū)動(dòng) W5100S 網(wǎng)卡.

SDK里已經(jīng)把它所有外設(shè)的驅(qū)動(dòng)都封裝成庫,只要按照 <ti/drivers/SPI.h> 文件中提供的說明,按順序調(diào)用對(duì)應(yīng)的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

這里僅貼出了一下部分,具體請(qǐng)到對(duì)應(yīng)的 .h 文件中查閱.

2.2 初始化與W5100S連接的接口

  • 通過 SysConfig 工具配置使用到的SPI以及一些控制引腳的IO


    配置成功后,點(diǎn)擊 FILE – Save 保存配置內(nèi)容。

  • 在 utility.h 文件中配置延時(shí)函數(shù)
    注釋掉 utility.c 文件中配置STM32滴答定時(shí)器用來延時(shí)的函數(shù),并在 utility.h 中使用宏定義定義延時(shí)函數(shù)

  • #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 文件中配置復(fù)位和中斷管腳
  • /** *@brief 初始化W5100s的復(fù)位與中斷管腳 *@param 無 *@return 無 */ void reset_break_gpio_init(void) {/* 請(qǐng)確保再此之前以調(diào)用過一次 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復(fù)位設(shè)置函數(shù) *@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 的讀寫函數(shù)及片選函數(shù)
  • #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); }/* 關(guān)閉SPI */ void bsp_HardSpiClose(void) {SPI_close(masterSpi); }/* 使用硬件SPI 發(fā)送一個(gè)字節(jié) */ 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 讀取一個(gè)字節(jié) */ 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 測試工程主函數(shù)

    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讀寫數(shù)據(jù)函數(shù)映射reg_wizchip_cs_cbfunc(bsp_W5100sCS_Low,bsp_W5100sCS_High); // SPI片選控制函數(shù)映射reset_w5100s(); // W5100S硬件復(fù)位PHY_check(); // 網(wǎng)線檢測程序set_w5100s_mac(); // 設(shè)置W5100SMAC地址set_w5100s_netinfo(); // 設(shè)置W5100S網(wǎng)絡(luò)參數(shù)sysinit(0x55,0x55); // 初始化4個(gè)Socket的發(fā)送接收緩存大小for(;;){do_tcp_client(); // TCP 客戶端數(shù)據(jù)回環(huán)測試}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); }
    • 完整的工程下載,請(qǐng)點(diǎn)擊 W5100S網(wǎng)卡的TCP-Client回環(huán)測試【資料中包含 STM32F103VET6 驅(qū)動(dòng) W5100S 的模板工程】,如果您沒有積分可以留言,我單獨(dú)發(fā)您。

    PS:

    • 使用IAR搭建CC2652RB的開發(fā)環(huán)境
    • IAR FOR ARM 需要 8.50.9 及以上版本才能打開.
    • 需要先安裝 CC2652RB 的 SDK,且需要安裝在默認(rèn)位置(C:\ti).

    總結(jié)

    以上是生活随笔為你收集整理的CC2652RB硬件SPI驱动W5100S网卡进行回环测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。