cn_x 发表于 2014-8-28 14:08:53

基于Kinetis的简单webserver(五篇连载)——转帖

项目描述
项目名称基于Kinetis的简单webserver
预计实施时间2011-12-22
采用平台K40
是否需要Kinetis塔式开发板(K40)特别支持是
设计大赛将为没有开发工具的网友,提供200个开发板支持名额,提供Kinetis K40塔式开发板一个,供网友完成设计。特别声明:开发板资源有限,如申请到开发板却又不能按计划完成设计,请联系工作人员退还开发板,我们将把开发板的名额顺延给更多的网友。请大家珍惜有限资源,为同道朋友提供更多机会。
背景描述近年来,物联网应用越来越普及,单片机控制系统实现远程网络控制成为趋势。

功能描述webserver的实现可以充分利用网络(有线或者无线)来控制单片机系统,为单片机的控制或采集数据等提供便利性,灵活性。

应用领域电子显示屏远程网络控制,家居电子设备远程控制等等。
解决办法使用单片机扩展简单的网络接口芯片,常见的ENC28J60

预期效果远程控制LCD的字符显示,更新等.

时间安排2011.12.31-2012.1.31Freesecal Kinetis平台软硬件学习
2012.2.1- 2012.2.29 基本功能实现
2012.3.1-2012.3.30扩展功能实现
总结

备注需要完整的软硬件平台调试


K40平台软硬件学习
K40开发板硬件框图
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930283897.jpg
平台的部分硬件特性:a.Cortex-M4核+DSP指令;b.最高100Mz主频;c.1.71-3.6V供电电压;d.256KB FLASH+64KB SRAM;e.256KB FlexNVM+4KB FlexRAM;f.10种电源模式;g.16-bit SAR ADC,12-bit DAC;h.USB OTG,充电检测;i.SPI,I2C,UART,CAN,I2S,T卡;j.电容触摸输入;

2012-1-18K40和K60的功能差异:红色标记为K60特有,蓝色为LCD差异
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930321935.jpg
2012-1-192012-1-20Micrium官方提供的K40-uc-OS-III和K60-uc-OS-II编译没有问题,准备用其中之一版本来做,首先把freescale官方的demo移植到其中之一;
试验先把LCD移植到uc-OS上,来回折腾了近两天,在K40-uc-OS-III版本上都没有问题了,但是在K60-uc-OS-II的版本上掉电再重启后,没有显示了,还没搞清哪边有问题,暂不搞了,确定下来先在K40-uc-OS-III的版本上来做。期间折腾的主要问题是,LCD的显示效果,直接从freescale demo软件包拷贝过来的LCD初始化代码,移植到uc-OS后显示效果就是没有demo的效果好,最终把LCD_GCR的部分位挨个试验,确认改成5V后,OK。而这一修改是在K60-uc-OS-II上试验出来的,K40-uc-OS-III上没发现,于是,又在这两个版本上徘徊了大半天。LCD的规格书上写的又是3V驱动,奇怪,坑爹啊。            | LCD_GCR_HREFSEL_MASK // ( 0 - 3 Volts LCDs / 1 - 5 Volts LCDs)


cn_x 发表于 2014-8-28 14:09:14

2012-1-29增加ENC28J60网络模块进行调试,根据原理图选用T卡部分的GPIO来连接ENC28J60,具体连接如下,其余就只连3.3V电源和地/********************************************************************* Hardware      :   CONNECTION                              K40x256      ->       Enc28j60                  PTD 12( SCLK )          SCK                     PTD 13( MISO )          SO                      PTD 14( MOSI )          SI                      PTD 15( CS )            CS#   *********************************************************************/具体方案是采用GPIO来模拟SPI通信,虽然K40本身是带SPI控制器的,但是这个很不熟悉,暂时还是使用之前成熟的GPIO来模拟部分关键代码如下
#define PORTD_GPIO_PTR((GPIO_MemMapPtr)0x400ff0c0u) //定义PTD的基地址
//通过PDOR寄存器的设定来设置GPIO输出高还是低#define set_clk_hGPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x1000      #define set_sdo_hGPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x4000      #define set_cs_h   GPIO_PDOR_REG(PORTD_GPIO_PTR) |= 0x8000
#define set_clk_lGPIO_PDOR_REG(PORTD_GPIO_PTR) &= ~(0x1000)#define set_sdo_lGPIO_PDOR_REG(PORTD_GPIO_PTR) &= ~(0x4000)#define set_cs_l   GPIO_PDOR_REG(PORTD_GPIO_PTR) &= ~(0x8000)
//通过读PDIR寄存器,读PTD13的输入#define get_sdi    (GPIO_PDIR_REG(PORTD_GPIO_PTR) & 0x2000)   //
初始化GPIO,模拟SPI总线void spi_init(void) { // use PORTD 12,13,14,15 to emulate SPI function
//configure as GPIO function      PORTD_PCR12= PORT_PCR_MUX(1);       PORTD_PCR13= PORT_PCR_MUX(1);      PORTD_PCR14= PORT_PCR_MUX(1);      PORTD_PCR15= PORT_PCR_MUX(1);
      GPIO_PDDR_REG(PORTD_GPIO_PTR) |= 0xD000;      //bit=1101      GPIO_PDDR_REG(PORTD_GPIO_PTR) &= ~(0x2000);   //make sure to set bit 13=0,may be commented ;
}

cn_x 发表于 2014-8-28 14:09:41

关键的SPI读和写代码void WriteByte(uint8_t data){    unsigned char i = 0;    unsigned char byte_mask = 0x80;    unsigned char tx_byte = data;
set_cs_l;for(i = 0; i < 8; i++){set_clk_l;delay(1); //about 4uS      if(tx_byte & byte_mask)      {set_sdo_h;      }       else      {set_sdo_l;      }delay(1);set_clk_h;      tx_byte = tx_byte << 1;delay(1);}set_clk_l;}
uint8_t ReadByte(void){unsigned char i = 0;uint8_t data=0;set_clk_l;    for(i = 0; i < 8; i++)    {set_clk_h;delay(1);      data = data << 1;if(get_sdi)      {            data |= 0x01;//get HIGH      }      else      {            data |= 0x00;//get LOW      }delay(1);set_clk_l;delay(1);    }return data;}
ENC28J60部分的模块,参照网上的,基本没有改动,把参考代码中的main函数,依照uc-OS-III的格式改写成任务函数,并且在点灯的部分改成点LCD(LCD的初始化及显示所有内容已经移植好),之间主要就是K40操作GPIO的部分不太熟悉,还好,参照网上的部分代码和规格书,很快就搞定了,秀一下成果

cn_x 发表于 2014-8-28 14:10:04



网络控制界面
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930362302.jpg
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930383233.jpg
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930402749.jpg
网络的控制没有问题了,下一步开始把SLCD的其它功能函数移植进去,字符的显示,滚动效果等等。




cn_x 发表于 2014-8-28 14:10:48



2012-1-30开始移植SLCD的其它功能函数这一步更简单了,直接将Kwikstik_Demo中的Driver_SLCD.h,Driver_SLCD.c,Fonts_LCD.c,Fonts_LCD.h拷贝过来,重定义下数据类型的转定义编译后没有问题了整理下软件代码结构,在uc-OS-III的根目录下创建Drivers文件夹和Net文件夹,把驱动文件都移到Drivers目录下,ENC28J60部分的放到Net目录下。方便后续代码的完善,增强代码的可读性。

2012-1-31参照http://tuxgraphics.org/electronics/200702/article07021.shtml 上的代码,整合web控制往LCD写字符显示。最初总是执行到app_vect.c的staticvoidApp_Fault_ISR (void)中,死循环,看函数好像跟应用有关,模拟器执行也是一样的,后来单步执行,最终发现是调用的_SLCDModule_PrintScrolling(char *SourceString)函数有问题,屏蔽掉后,OK。
秀一下最终图片
http://bbs.ednchina.com/images/attachments/201203/30439_TIME_1330930438319.jpg
2012-2-1提供WEB控制SLCD显示字符及开关SLCD的显示视频见附件。系统连接在wifi路由器上,通过电脑无线网络控制,也可以使用带wifi模块的手机控制。
小结:到此,整个项目已经完成。单片机系统通过扩展网络模块,可以让开发者更好的利用网络来使用系统资源,给终端用户提供人性化,便利化的完美用户体验。本文只是使用网络来远程控制LCD的显示,在此基础平台上可以开发出更多的终端应用,比如简单的远程控制系统,远程监测测量等等。
END





qerty2008 发表于 2014-8-28 14:17:47

如果是使用ENC28J60
那么程序基本与Kinetis关系不大

设置好IO口,模拟SPI时序,能读写ENC28J60就可以了

lzl000 发表于 2014-8-28 16:35:38

又见楼主转帖

wxfje 发表于 2014-8-28 20:28:40

楼主辛苦了,转这么多好资料来

chjf 发表于 2014-8-29 10:47:19

楼主辛苦了。

sunnyqd 发表于 2014-8-29 11:05:34

顶lz      

浪里白条 发表于 2014-8-29 11:06:49

感谢楼主分享,这东西感觉蛮好玩。

jiang887786 发表于 2014-9-2 11:31:45

高人贴,顶一下!

rockyyangyang 发表于 2014-9-4 14:30:55

mark               
页: [1]
查看完整版本: 基于Kinetis的简单webserver(五篇连载)——转帖