发新帖本帖赏金 10.00元(功能说明)我要提问
12下一页
返回列表
打印
[DemoCode下载]

DAVICOM DM9051 SPI 接口以太网模块 + M451 + FreeRTOS + uIP 实现WebServer

[复制链接]
6857|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jf7686|  楼主 | 2016-2-3 16:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jf7686 于 2016-10-7 10:14 编辑

        在前几个礼拜发了一篇 DM9051 SPI 接口以太网模块 + NuTinyM051 + uIP实现web server后,原本想在发一篇 DM9051 SPI 接口以太网模块 + NuTinyM451 + uIP,但 Nu_Micro大大已经先PO了 M451+DM9051(SPI接口网络芯片)的uIP demo code移植,所以我直接参考,再移植过程中发现DM9051的驱动与我之前的M0516 + DM9051写法有些不太一样,两者差异在M0516 SPI有4 level FIFO, M451 SPI支援8 level FIFO,所以直接参考修改,所以修改了部份的驅動且加上FreeRTOS OS,一样实现web server。

1.硬件描述
   (1) 首先DM9051NP SPI接口以太网模块:
        相关描述就不多说了,可以参考DM9051 SPI 接口以太网模块 + NuTinyM051 + uIP实现web server,或 STM32F103+DM9051_UIP_SPI to 以太网
        
   (2) NuTinyM451使用的是SPI0与DM9051NP SPI脚位硬体连接:

NuTinyM451DM9051NP
CSSPB.4 (Pin 95)(Pin 01)
MOSIPB.5 (Pin 04)(Pin 03)
MISOPB.3 (Pin 94)(Pin 05)
CLKPB.2 (Pin 93)(Pin 07)

       下图是NuTinyM451 + DM9051NP 接线示意图:

2.驱动说明
      在移植过程中发现,M451+DM9051(SPI接口网络芯片)的uIP demo code移植中的驱动写得有些复杂,所以我参考M051的驱动修改,修改完后正常动作且SPI Frequence 最高能设到24 Mhz。

   (1). 首先配置M451 SPI0 相关设定
void DM9051_Configuration(void)
{        
        /* Enable SPI0 Module clock */
        CLK_EnableModuleClock(SPI0_MODULE);
        /* SPI0 module clock from EXT */
        CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL2_SPI0SEL_PCLK0, MODULE_NoMsk);

        /* Reset IP */
        SYS_ResetModule(SPI0_RST);

        SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB2MFP_Msk | SYS_GPB_MFPL_PB3MFP_Msk | SYS_GPB_MFPL_PB4MFP_Msk | SYS_GPB_MFPL_PB5MFP_Msk);
        SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB2MFP_SPI0_CLK | SYS_GPB_MFPL_PB3MFP_SPI0_MISO0 | SYS_GPB_MFPL_PB4MFP_SPI0_SS | SYS_GPB_MFPL_PB5MFP_SPI0_MOSI0);

        /*---------------------------------------------------------------------------------------------------------*/
        /* Init SPI                                                                                                */
        /*---------------------------------------------------------------------------------------------------------*/
        /* Configure SPI0 as a master, SPI clock rate 24 MHz,
                 clock idle low, 32-bit transaction, drive output on falling clock edge and latch input on rising edge. */
        SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 8,  24000000);
        
        /* Enable the automatic hardware slave selection function. Select the SPI0_SS pin and configure as low-active. */
        //SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);
        SPI_DisableAutoSS(SPI0);
        SPI_ENABLE(SPI0);
        
        SPI_SetFIFO(SPI0, 7, 7);
}

    与Nu_Micro的M451+DM9051(SPI接口网络芯片)的uIP demo code移植的DM9051驱动改较多的部份是,SPI R/W spi array data, 修改如下:
   (2). 连续读出 data 从spi array
void DM9051_Read_Mem(uint8_t* pu8data, uint32_t datalen)
{
        uint32_t i;
               
        // Read SPI_Data_Array back from the slave
        uint8_t burstcmd = SPI_RD_BURST;
        
        SPI_SET_SS_LOW(SPI0);

        SPI_WRITE_TX(SPI0, (uint32_t)burstcmd);
        while(SPI_IS_BUSY(SPI0));
        SPI_READ_RX(SPI0);                //Skip SPI RX FIFO

        for(i = 0 ; i < datalen; i++)
        {
                pu8data[i] = SPI_WRITE_TX(SPI0, (uint32_t )0x0);
                while(SPI_GET_RX_FIFO_EMPTY_FLAG(SPI0));
                        pu8data[i] = (uint8_t)SPI_READ_RX(SPI0);
        }
        SPI_SET_SS_HIGH(SPI0);
}

   (3). 连续写入data到spi array
void DM9051_Write_Mem(uint8_t* pu8data, uint32_t datalen)
{
        uint32_t i;
        
        // Send the array to the slave
        uint8_t burstcmd = SPI_WR_BURST;
                           
       SPI_SET_SS_LOW(SPI0);
  
        SPI_WRITE_TX(SPI0, (uint32_t)burstcmd);
        while(SPI_IS_BUSY(SPI0));
        SPI_READ_RX(SPI0);                //Skip SPI RX FIFO
        
        for(i = 0; i < datalen; i++)
        {
                while(SPI_GET_TX_FIFO_FULL_FLAG(SPI0));
                        SPI_WRITE_TX(SPI0, (uint32_t)pu8data[i]);
        }

        while(SPI_IS_BUSY(SPI0));        
        SPI_ClearRxFIFO(SPI0);
        
        SPI_SET_SS_HIGH(SPI0);
}

3.FreeRTOS说明
      FreeRTOS的部分可参考M451SeriesBSP_CMSIS Library 里的Sample做相关移植或网上找有满多相关说明,我直接拿Library 的sample把里面一些原本的Task拿掉只留下uIP 跟 LED 控制的 Task:

   (1). Create Task
int main( void )
{
        /* Init System */
       prvSetupHardware();

        /* create task */
        xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", configMINIMAL_STACK_SIZE * 3, NULL, tskIDLE_PRIORITY + 4, NULL );

        xTaskCreate( vLEDTask, ( signed portCHAR * ) "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL );
        
        printf("FreeRTOS is starting ...\n");
        /* start OS */
        vTaskStartScheduler();
  
        for(;;);
}

   (2). LED Task
void vLEDTask( void *pvParameters )
{
        /* Set LED */
        GPIO_EnableInt(PC, 9, GPIO_INT_FALLING);
        GPIO_SetMode(PC, BIT9, GPIO_MODE_OUTPUT);
        
        for( ;; )
        {
                if(Web_LED_FLASH == 1){
                        PC9 = 1;
                        vTaskDelay( 500 / portTICK_RATE_MS );
                        PC9 = 0;
                        vTaskDelay( 500 / portTICK_RATE_MS );
                }
        }
}

   (3). uIP Task
          uIP Task 里面的写法与设定只是将原本的uIP的main()改成void vuIP_Task( void *pvParameters )在这就不多做介绍,在设定FreeRTOS Task Delay Timer 在while(1) 加上
#ifdef __DHCPC_H__
                else if (timer_expired(&dhcp_timer)) {
            // for now turn off the led when we start the dhcp process
            //led_low();
            dhcpc_renew();
            timer_reset(&dhcp_timer);
    }
#endif // __DHCPC_H__
                else{
                        /* task delay */
                        vTaskDelayUntil( &xLastWakeTime, xFrequency );
                        //vTaskDelay( 100 / portTICK_RATE_MS );
                }
  }
//  return 0;
}

4.简单的web server 控制 LED
       Web Server与 DM9051 SPI 接口以太网模块 + NuTinyM051 + uIP实现web server 的设定大致相同一样能看到MCU 与 IP 相关讯息和控制LED,只是新增了一个选项Task_CON, 原本的设定FreeRTOS Task就是跑uIP 和LED闪烁,但进入网页后为了能使网页控制LED 设定的一个Web_LED_FLASH Flag 来判断目前LED状态,网页后按下ON、OFF、FLASH会暂停FreeRTOS 的LED Task , 在user 不想用网页控制时,在按下Task_Con就能切换为FreeRTOS控制。

       一样输入IP地址 192.168.XXX.XXX进入 uip web server控制LED,因为uip  有开DHCP 也可设定为固定IP ,看使用者设定输入正确的IP地址

       进入网页后就能控制LED,如下可以看到MCU + DM9051相关讯息,最下面可以看到控制LED 选单,按下on 、off 、Flash、Task_CON后网址后面会分别显示XXX.XXX.XXX.XXX / LED0、1、2、3让使用者可以知道目前设定

以上完成后就是一个简单webserver 控制LED应用了,最后一樣附上程序:
RAM 大约使用了 12264 (  11.98kB)
ROM 大约使用了 43860 (  42.83kB),因为有OS的关係,版上各位在应用上有想法或是问题都可以提出一起讨论,谢谢。

NUC-M451_FreeRTOS_uIP_DM9051_WebServer.rar (895.01 KB)

打赏榜单

21ic小喇叭 打赏了 10.00 元 2016-02-16
理由:原创分享~~

沙发
芙蓉洞| | 2016-2-3 18:14 | 只看该作者
这个ROM占用的还挺大的

使用特权

评论回复
板凳
jf7686|  楼主 | 2016-2-3 21:32 | 只看该作者
芙蓉洞 发表于 2016-2-3 18:14
这个ROM占用的还挺大的

是满大的,不过M451 有256k ROM,应该很够用。谢谢

使用特权

评论回复
地板
qq280572| | 2016-2-4 09:30 | 只看该作者
作为一个免费的操作系统,采用FreeRTOS可在基本满足较小系统需要的情况下降低系统成本、简化开发难度。

刚去翻了下何为FreeRTOS:
http://blog.csdn.net/lxl584685501/article/details/46621991

使用特权

评论回复
5
jf7686|  楼主 | 2016-2-5 14:36 | 只看该作者
qq280572 发表于 2016-2-4 09:30
作为一个免费的操作系统,采用FreeRTOS可在基本满足较小系统需要的情况下降低系统成本、简化开发难度。

刚 ...

大大真有心还找了FreeRTOS的网站,应用上有问题的话可以提出,谢谢。

使用特权

评论回复
6
quray1985| | 2016-2-8 16:34 | 只看该作者
这个freertos是可剥夺内核的操作系统吗

使用特权

评论回复
7
643757107| | 2016-2-8 19:50 | 只看该作者
那个WIFI模块是集成了发送字符串的功能了,还是需要对那个模块进行操作

使用特权

评论回复
8
jf7686|  楼主 | 2016-2-8 22:47 | 只看该作者
quray1985 发表于 2016-2-8 16:34
这个freertos是可剥夺内核的操作系统吗

您"可剥夺内核的操作系统" ,如果是指web control led 跟 FreeRTOS LED Task 这部分,我只是用一个简单的flag去判断让条件成立,进而停止FreeRTOS 的LED  Task,可以下载看一下source code大概就能了解。如果是指别的部分,那可能要请您再多说明一些,谢谢。

使用特权

评论回复
9
jf7686|  楼主 | 2016-2-8 22:50 | 只看该作者
643757107 发表于 2016-2-8 19:50
那个WIFI模块是集成了发送字符串的功能了,还是需要对那个模块进行操作

我不太懂您的意思,此部分没有wifi模块,只有一个SPI 网口的模块,照片上那个DM9051NP是有线的网口模块,还是您问的FreeRTOS 的部分?

使用特权

评论回复
10
cowboy2014| | 2016-2-10 14:11 | 只看该作者
这个芯片带phy吗,是怎样和mcu连接的呢?

使用特权

评论回复
11
玛尼玛尼哄| | 2016-2-10 14:26 | 只看该作者
一样输入IP地址 192.168.XXX.XXX进入 uip web server控制LED,因为uip  有开DHCP 也可设定为固定IP

使用特权

评论回复
12
天灵灵地灵灵| | 2016-2-10 16:55 | 只看该作者
作为一个免费的操作系统,采用FreeRTOS可在基本满足较小系统需要的情况下降低系统成本、简化开发难度。

使用特权

评论回复
13
yiyigirl2014| | 2016-2-10 18:16 | 只看该作者
ucOS用的人最多,也应该最好学。

使用特权

评论回复
14
捉虫天师| | 2016-2-11 18:55 | 只看该作者
网络通信的协议是集成到了网络模块还是需要单片机实现?

使用特权

评论回复
15
jf7686|  楼主 | 2016-2-11 22:08 | 只看该作者
捉虫天师 发表于 2016-2-11 18:55
网络通信的协议是集成到了网络模块还是需要单片机实现?

需要单片机,且单片机要有支援SPI

使用特权

评论回复
16
643757107| | 2016-2-13 11:41 | 只看该作者
用起来好麻烦啊,如果整个 模块作为一个函数就行了,我给一个参数,包含我要发送的东西以及地址,多好。

使用特权

评论回复
17
598330983| | 2016-2-13 11:56 | 只看该作者
jf7686 发表于 2016-2-8 22:47
您"可剥夺内核的操作系统" ,如果是指web control led 跟 FreeRTOS LED Task 这部分,我只是用一个简单的 ...

我是想知道如何用这个模块发送东西啊。

使用特权

评论回复
18
qq280572| | 2016-2-15 14:45 | 只看该作者
cowboy2014 发表于 2016-2-10 14:11
这个芯片带phy吗,是怎样和mcu连接的呢?

带MAC+phy, 通过SPI接口4根线相连。

使用特权

评论回复
19
捉虫天师| | 2016-2-15 15:39 | 只看该作者
是不是各种网络模块使用方法都是差不多类似的啊?

使用特权

评论回复
20
jf7686|  楼主 | 2016-2-15 17:24 | 只看该作者
捉虫天师 发表于 2016-2-15 15:39
是不是各种网络模块使用方法都是差不多类似的啊?

这个要看各家厂商设计的产品

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

57

帖子

1

粉丝