野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6923|回复: 1

M0+MAC+TCP/IP 以太网单芯片方案 W7500EVB用户手册连载(10)--实战篇

[复制链接]
发表于 2018-3-8 18:06:30 | 显示全部楼层 |阅读模式
W7500(W7500P)芯片简介:

W7500 芯片为工业级以太网单芯片解决方案, 集成 ARM Cortex-M0,128KB Flash 及全硬件TCP/IP 核(和W5500、W5100内核一致),特别适用于物联网领域。 使用 W7500EVB, 让您轻松完成原型开发。

全硬件TCP/IP核的最大优点是他在执行联网操作时不需要占用MCU的运行资源,大大增加了MCU的工作效率。

本章将向大家介绍W7500的 DMA。在本章中,将利用 DMA将串口接收到的数据传送到变量中,在通过串口将变量输出打印出来。

想了解更多关于WIZnet W7500更多信息,或者有技术问题请联系我们:gustin@wisioe.com

深圳炜世科技—WIZnet官方代理商,全程技术支持,价格绝对优势!

电话:0755-86568556



回复

使用道具 举报

 楼主| 发表于 2018-3-8 18:08:00 | 显示全部楼层
本帖最后由 WSGustin 于 2018-3-9 17:29 编辑

第十一章 DMA试验

本章将向大家介绍W7500的 DMA。在本章中,将利用 W7500的DMA将串口接收到的数据传送到变量中,在通过串口将变量输出打印出来。
本章分为如下几个部分:
11.1 W7500 DMA 简介
11.2 硬件设计
11.3 软件设计
11.4 下载验证

11.1 W7500 DMA 简介
直接内存访问 (DMA) 用于外设与内存之间、内存与内存之间的高速数据传送。无需 CPU 参与,数据即可快速传送。这样就为 CPU 执行其他操作留出了资源空间。W7500的 DMA 控制器共有6个通道,每个通道都用于管理来自某个或多个外设的内存访问请求。在DMA 请求过程中,有一个处理优先级的裁决。
W7500 的 DMA 有以下一些特性:
6个通道
每一个通道用于连接专门的硬件 DMA 请求,并同时支持软件触发器。
软件编译来自 DMA 通道的请求优先级 (系统默认为高级)。
内存到内存传输 (仅支持软件请求)。
TCP/IP 到内存传输 (仅支持软件请求)。
SPI/UART 到内存传输 (支持软件及硬件请求)。
获取 Flash, SRAM, APB 及 AHB 外设作为源和目的地。
从外设(UART0, UART1, SSP0, SSP1)产生的 DMA 请求,通过逻辑或输入到DMA 控制器,这就意味着同时只能有一个请求有效,如图11.1.1所示:
1.JPG
图11.1.1 W7500 DMA通道功能表
备注:软件请求是内存到内存及 TCP/IP 到内存之间使用 DMA 的唯一方式。
这里介绍一下 DMA设置相关的几个寄存器。
第一个是DMA的状态寄存器(DMA_STATUS),如图11.1.2所示:
       2.JPG
          3.JPG    
图11.1.2 W7500 DMA的状态寄存器
这个寄存器是只读的寄存器,读取ENABLE这个位可以获取DMA控制器的状态,读取STATE[4]-[7]位可以看到控制状态机的当前状态。
第二个是DMA 的控制数据库指针寄存器(DMA_CTRL_BASE_PTR),如图11.1.3所示:
4.JPG
图11.1.3 W7500 DMA 的控制数据库指针寄存器
把数据源的地址写入该寄存器。
第三个是DMA 的通道设置使能寄存器(DMA_CHNL_ENABLE_SET),如图11.1.4所示:
5.JPG
图11.1.4 W7500 DMA 的通道设置使能寄存器
该寄存器可以使能要开启的DMA通道。
第四个是DMA的通道软件请求寄存器(DMA_CHNL_SW_REQUEST),如图11.1.5所示:
   6.JPG
图11.1.5 W7500 DMA的通道软件请求寄存器
在需要的时候设置对应的位来开启DMA的传输。
DMA配置可以直接调用函数库的dma_init函数来对DMA进行初始化。
  1. void dma_init(void);
复制代码
如果要进行数据传输可以调用dma_memory_copy函数。
  1. void dma_memory_copy (uint32_t chnl_num, unsigned int src, unsigned int dest, unsigned int size, unsigned int num);
复制代码
dma_memory_copy函数的第一个参数为传输通道,第二个参数为数据源地址,第三个为数据目的地地址,第四个参数是传输的数据大小,第五个参数是传输数据的长度。如果要将tx_data中的数据通过DMA通道0传输到rx_data中可以这样写:
  1. uint32_t tx_data = 0xFFF;
  2. uint32_t rx_data;
  3. dma_memory_copy (0, &tx_data, &rx_data , 2, 1);
复制代码
11.2 硬件设计
本章用到的硬件资源有:
1)      串口
2)      DMA
11.3 软件设计
在W7500EVB DMA工程里,可以看到,user文件中多了 bsp_dma.c 文件和其头文件 bsp_dma.h,同时要引入 dma 相关的库函数文件 W7500x_dma.c 和W7500x _dma.h。
打开bsp_dma.c 文件, 主要代码如下:
  1. void dma_mm_init(void)
  2. {
  3.   dma_data_struct_init();        //初始化DMA数据结构体
  4.   dma_init();                //初始化DMA
  5. }

  6. void DMA_Memory_Copy(uint32_t chnl_num, unsigned int *src, unsigned int *dest, unsigned int size, unsigned int num)
  7. {
  8.   uint32_t current_state;

  9.   dma_memory_copy(chnl_num, (unsigned int) src,(unsigned int) dest , size, num);
  10.   do{
  11.     current_state = (DMA->DMA_STATUS >> 4) & 0xF;
  12.   }while (current_state!=0);
  13. }
复制代码

该部分代码有2个函数,第一个dma_mm_init函数是DMA的初始化。第二个DMA_Memory_Copy函数是进行数据传输的。
最后看看W7500x_it.c文件如下:
  1. void UART2_Handler(void)
  2. {
  3.   uint32_t rx_data;

  4.   DMA_Memory_Copy(3, (unsigned int*) &UART2->DATA,(unsigned int*) &rx_data , 0, 1);
  5.   S_UART_SendData(rx_data);
  6.   S_UART_ClearITPendingBit(S_UART_IT_FLAG_RXI);
  7. }
复制代码
这里可以看到并没有使用串口2的数据接收函数,而是有DMA通道3将UART2数据寄存器的数据传输到了rx_data变量中在利用串口2打印出来。
11.4 下载验证
在代码编译成功之后,下载代码到W7500EVB上,打开串口调试助手向W7500EVB发送数据,W7500EVB也会回发数据给我们,如图11.4.1所示:
7.JPG
图11.4.1 W7500EVB DMA试验结果



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-4 11:45 , Processed in 0.031725 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表