查看: 2226  |  回复: 4
M0+MAC+TCP/IP 以太网单芯片方案 W7500EVB用户手册连载(10)--实战...

主题

回复
发表于2018-03-08 17:42:47 | 只看该作者
1# 电梯直达

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
邮箱:support@wisioe.com


主题

回复
发表于2018-03-08 17:45:51   |  只看该作者
2#

第十一章 DMA试验

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


11.1 W7500 DMA 简介

直接内存访问 (DMA) 用于外设与内存之间、内存与内存之间的高速数据传送。无需 CPU 参与,数据即可快速传送。这样就为 CPU 执行其他操作留出了资源空间。W7500的 DMA 控制器共有6个通道,每个通道都用于管理来自某个或多个外设的内存访问请求。在DMA 请求过程中,有一个处理优先级的裁决。

W7500 的 DMA 有以下一些特性:

u  6个通道

u  每一个通道用于连接专门的硬件 DMA 请求,并同时支持软件触发器。

u  软件编译来自 DMA 通道的请求优先级 (系统默认为高级)

u  内存到内存传输 (仅支持软件请求)

u  TCP/IP 到内存传输 (仅支持软件请求)

u  SPI/UART 到内存传输 (支持软件及硬件请求)

u  获取 Flash, SRAM, APB  AHB 外设作为源和目的地。

从外设(UART0, UART1, SSP0, SSP1)产生的 DMA 请求,通过逻辑或输入到DMA 控制器,这就意味着同时只能有一个请求有效,如图11.1.1所示:

 

11.1.1 W7500 DMA通道功能表

备注:软件请求是内存到内存及 TCP/IP 到内存之间使用 DMA 的唯一方式。

这里介绍一下 DMA设置相关的几个寄存器。

第一个是DMA的状态寄存器(DMA_STATUS),如图11.1.2所示:

         

11.1.2 W7500 DMA的状态寄存器

这个寄存器是只读的寄存器,读取ENABLE这个位可以获取DMA控制器的状态,读取STATE[4]-[7]位可以看到控制状态机的当前状态。

第二个是DMA 的控制数据库指针寄存器(DMA_CTRL_BASE_PTR),如图11.1.3所示:

 

11.1.3 W7500 DMA 的控制数据库指针寄存器

把数据源的地址写入该寄存器。

第三个是DMA 的通道设置使能寄存器(DMA_CHNL_ENABLE_SET),如图11.1.4所示:

 

11.1.4 W7500 DMA 的通道设置使能寄存器

该寄存器可以使能要开启的DMA通道。

第四个是DMA的通道软件请求寄存器(DMA_CHNL_SW_REQUEST),如图11.1.5所示:

  

11.1.5 W7500 DMA的通道软件请求寄存器

在需要的时候设置对应的位来开启DMA的传输。

DMA配置可以直接调用函数库的dma_init函数来对DMA进行初始化。


void dma_init(void);

如果要进行数据传输可以调用dma_memory_copy函数。

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中可以这样写:

uint32_t tx_data = 0xFFF;
uint32_t rx_data;
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 文件, 主要代码如下:

void dma_mm_init(void)
{
  dma_data_struct_init();	//初始化DMA数据结构体
  dma_init();		//初始化DMA
}

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

  dma_memory_copy(chnl_num, (unsigned int) src,(unsigned int) dest , size, num); 
  do{
    current_state = (DMA->DMA_STATUS >> 4) & 0xF; 
  }while (current_state!=0); 
}

该部分代码有2个函数,第一个dma_mm_init函数是DMA的初始化。第二个DMA_Memory_Copy函数是进行数据传输的。

最后看看W7500x_it.c文件如下:

void UART2_Handler(void)
{
  uint32_t rx_data; 

  DMA_Memory_Copy(3, (unsigned int*) &UART2->DATA,(unsigned int*) &rx_data , 0, 1); 
  S_UART_SendData(rx_data);
  S_UART_ClearITPendingBit(S_UART_IT_FLAG_RXI); 
}

这里可以看到并没有使用串口2的数据接收函数,而是有DMA通道3UART2数据寄存器的数据传输到了rx_data变量中在利用串口2打印出来。

11.4 下载验证

在代码编译成功之后,下载代码到W7500EVB上,打开串口调试助手向W7500EVB发送数据,W7500EVB也会回发数据给我们,如图11.4.1所示:

 

11.4.1 W7500EVB DMA试验结果



主题

回复
发表于2018-03-09 12:15:49   |  只看该作者
3#
这东西不错

主题

回复
发表于2018-03-09 16:54:31   |  只看该作者
4#
发表于2018-03-09 12:15:49  3# 这东西不错
有兴趣可以跟我们联系,售后全程技术支持。

主题

回复
发表于2019-05-03 10:21:48   |  只看该作者
5#
这东西要是有 串口空闲中断 牛了

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部