查看: 3195|回复: 6

[分享] 自己在nxp系列的小成就,新USB例程使用库函数写代码NXP LPC 1..

[复制链接]

该用户从未签到

3

主题

11

帖子

0

新手上路

Rank: 1

积分
39
最后登录
2016-12-30
发表于 2016-9-8 14:59:36 | 显示全部楼层 |阅读模式
自己在nxp系列的小成就,使用库函数写代码

/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:           main.c
** Last modified Date:  2009-05-12
** Last Version:        V1.01
** Descriptions:        The main() function example template
**
**--------------------------------------------------------------------------------------------------------
** Created by:          Chengmingji
** Created date:        2009-07-24
** Version:             V1.00
** Descriptions:        添加用户应用程序
**                      特殊说明:有关NVIC中断设置函数,core_cm3.h里面的NVIC设置函数不可直接使用,因为
**                      本uC/OS任务中为用户级特权,无权限修改NVIC寄存器,必须调用IRQ.H的NVIC设置函数。
**
**--------------------------------------------------------------------------------------------------------
** Modified by:         LiuWeiyun
** Modified date:       2009-07-27
** Version:             V1.01
** Descriptions:        编写USB_OTG例程
**
** Rechecked by:        WangJianyu
*********************************************************************************************************/
#include "LPC177x_8x.h"                                                 /* LPC177x_8x外设寄存器         */
#include "includes.h"
#include "uart.h"
#include "..\ZLG.FS\FSConfig.h"
#include "..\ZLG.USBOTG\OTG\OTGincludes.h"
#include <stdio.h>


/*********************************************************************************************************
  变量与宏定义
*********************************************************************************************************/
#define BEEP                (1 << 30)                                   /* 蜂鸣器                       */
#define BEEP_INIT()         LPC_GPIO3->DIR |=  BEEP                     /* 配置P3.30为输出              */
#define BEEP_ON()           LPC_GPIO3->CLR |= BEEP                      /* 蜂鸣器开                     */
#define BEEP_OFF()          LPC_GPIO3->SET |= BEEP                      /* 蜂鸣器关                     */


#define FILE_SIZE           1024                                        /* 文件大小                     */
#define STR_SEND(s)         uart0SendStr(s)                             /* 发送(打印)字符串             */


/*********************************************************************************************************
    按键定义
    P2.11和外部中断1(OTG ATX中断)输入复用,故该IO口不能再用作按键输入
    请使用杜邦线将按键2(上移按键)连接到SmartCortex M3-1700的P2.1
*********************************************************************************************************/
#define KEY_LEFT       (LPC_GPIO0->PIN & (1 << 10) ? 1 : 0)             /* 左移键,P0.10                 */
#define KEY_RIGHT      (LPC_GPIO0->PIN & (1 << 12) ? 1 : 0)             /* 右移键,P0.12                 */


#define KEY_PRESSED    0
#define KEY_RELEASED   1


/*********************************************************************************************************
  定义全局变量
*********************************************************************************************************/
static OS_STK stkMainTask[256];


static OS_STK GstkFileTask[512];
static OS_STK GstkOTGBServeTask[512];


static INT8U  Gu8FDataWr[FILE_SIZE];
static INT8U  Gu8FDataRd[FILE_SIZE];


static INT8U  Gu8FData[] = "USB OTG---Designed by ZLGMCU\r\n";          /* 文件内容                     */


static INT8U  Gu8PreX = 0, Gu8CurX = 0;                                 /* X轴的上一次与当前的位置值    */




/*********************************************************************************************************
** Function name:       keyServe
** Descriptions:        按键处理
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void  keyServe (void)
{
    if (KEY_PRESSED == KEY_LEFT) {
        Gu8CurX--;
    }
    else if (KEY_PRESSED == KEY_RIGHT) {
        Gu8CurX++;
    }
}


/*********************************************************************************************************
** Function name:       usbDevHIDServe
** Descriptions:        HID鼠标处理
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void  usbDevHIDServe (void)
{
    UINT8 pEpBuf[EP1_PACKET_SIZE];                                      /* 逻辑端点1接收缓冲区          */


    if(bEPPflags.bits.hid_enumed == 1) {                                /* 若HID类设备枚举成功          */


        USB_ENTER_CRITICAL_SECTION();


        pEpBuf[0] = 0x00;
        pEpBuf[1] = (INT8U)(Gu8CurX - Gu8PreX);                         /* X: 发送x变化值               */
        pEpBuf[2] = 0;                                                  /* Y: 发送y变化值               */
        pEpBuf[3] = 0x00;


        usbDevWriteEndpoint(3, pEpBuf, 4);                              /* 通过逻辑端点1的IN端点        */
                                                                        /* 发送鼠标移动值到USB主机      */
        USB_EXIT_CRITICAL_SECTION();


        Gu8PreX = Gu8CurX;                                              /* 保存X、Y的当前位置值         */
    }
}


/*********************************************************************************************************
** Function name:       otgTestInit
** Descriptions:        OTG Test初始化
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void  otgTestInit (void)
{
    INT8U  ucErr;


    UARTInit(2, 115200);
    STR_SEND("Here comes the OTG TEST\r\n");
   
//    OS_NVIC_SetPriority(EINT1_IRQn, 12);     
//    OS_NVIC_EnableIRQ(EINT1_IRQn);     


    ucErr = otgInit(5, 6, 7);
    if (ucErr != TRUE) {
        STR_SEND("\r\nOTG init fail\r\n");
        while (1);
    }


    NVIC_SetPriority(USB_IRQn, 11);     
    NVIC_EnableIRQ(USB_IRQn);     
}


/*********************************************************************************************************
** Function name:       otgBServe
** Descriptions:        OTG role B serve
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void  otgBServe (void)
{
    while (!otgIsDeviceReady()) {                                       /* 等待枚举完设备               */
        OSTimeDly(10);
    }


    while (OTG_ROLE_DEVICE == otgGetCurRole()) {
        keyServe();
        usbDevHIDServe();
        OSTimeDly(OS_TICKS_PER_SEC / 100);
    }
}


/*********************************************************************************************************
** Function name:       otgAServe
** Descriptions:        OTG role A serve
** input parameters:    无
** output parameters:   无           
** Returned value:      无
*********************************************************************************************************/
void  otgAServe (void)
{
    char   pcFileAttr[] = "RW";
    char   pcFileName[] = "A:\\OTG.TXT";


    HANDLE FHandle;
    INT32U j, uiLen;
    INT8U  ucErr;


    OSTaskCreate(OSFileTask, (void *)0, &GstkFileTask[511], 8);


    OSTimeDly(10);


    while (1) {


        j = 0;
        while (!otgIsDeviceReady()) {                                   /* 等待枚举完设备               */
            OSTimeDly(10);
            if (j++ > 200) {
                j = 0;
                STR_SEND("\r\nwait device ready...\r\n");
            }
        }


        while (otgGetCurRole() != OTG_ROLE_HOST) {                      /* 等待当前角色为主机           */
            OSTimeDly(10);
        }


        OSAddFileDriver(usbCammand);                                    /* 增加ATA设备0                 */


        for (j = 0; j < FILE_SIZE; j++) {
            Gu8FDataWr[j] = Gu8FData[j % (sizeof(Gu8FData) - 1)];
        }


        OSRemoveFile(pcFileName);                                       /* 删除已存在的同名文件         */


        FHandle = OSFileOpen(pcFileName, pcFileAttr);                   /* 打开文件                     */
        if (FHandle == Not_Open_FILE) {
            STR_SEND("\r\n\tOSFileOpen failed!\r\n");
        }
       #if 0
        OSFileSeek(FHandle, 0, SEEK_SET);                               /* 文件指针移到文件开始         */
       #endif
        uiLen = OSFileWrite(Gu8FDataWr, sizeof(Gu8FDataWr), FHandle);
                                                                        /* 写入文件                     */
        OSFileClose(FHandle);
        if (uiLen > 0) {
            OSAllCacheWriteBack();
        }
        if (uiLen >= sizeof(Gu8FDataWr)) {                              /* 写文件成功                   */
            STR_SEND("\r\nWritefile sucess!");
        } else {
            STR_SEND("\r\nWrite file failed!\r\n");
        }


        FHandle = OSFileOpen(pcFileName, "R");                          /* 打开文件                     */
        if (FHandle == Not_Open_FILE) {
            STR_SEND("\r\n\tOSFileOpen failed!\r\n");
        }
        OSFileSeek(FHandle, 0, SEEK_SET);                               /* 文件指针移到文件头部         */
        memset(Gu8FDataRd, 0, sizeof(Gu8FDataRd));
        uiLen = OSFileRead(Gu8FDataRd, sizeof(Gu8FDataRd), FHandle);
                                                                        /* 读出文件                     */
        OSFileClose(FHandle);
        if (uiLen >= sizeof(Gu8FDataRd)) {                              /* 读文件成功                   */
            STR_SEND("\r\nReadfile sucess");
        } else {
            STR_SEND("\r\nRead file failed!\r\n");
        }


        if (memcmp(Gu8FDataRd, Gu8FDataWr, FILE_SIZE)) {
            STR_SEND("\r\nVerify file failed!\r\n");
        } else {
            STR_SEND("\r\nVerify file sucessed!\r\n");
        }


        OSTimeDly(100);
        OSRemoveFileDriver(0);                                          /* 移除设备                     */
        OSTimeDly(5);


        STR_SEND("\r\n请拔出USB设备!\r\n");
        while (otgIsDeviceReady()) {
            OSTimeDly(OS_TICKS_PER_SEC / 50);
        }


        if (otgGetDeviceAB() == OTG_DEVICE_A) {                         /* 当前设备为A设备              */
            otgHNPStart();                                              /* 启动HNP,切换主从机角色       */
        } else {
            ucErr = otgRetControlToA();                                 /* 否则为B设备,归还总线控制权   */
            if (ucErr == TRUE) {
                BEEP_ON();
                OSTimeDly(OS_TICKS_PER_SEC / 2);
                BEEP_OFF();
            }
        }
    }
}


/*********************************************************************************************************
** Function name:       otgBServeTask
** Descriptions:        otgBServe任务
** input parameters:    pvData: 没有使用
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void  otgBServeTask (void *pvData)
{
    pvData = pvData;


    while (1) {
        otgBServe();
        OSTimeDly(OS_TICKS_PER_SEC / 4);
    }
}


/*********************************************************************************************************
** Function name:       mainTask
** Descriptions:        主任务
** input parameters:    pvData: 没有使用
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void  mainTask (void *pvData)
{
    pvData = pvData;


    BEEP_INIT();
    BEEP_OFF();


    otgTestInit();


    OSTaskCreate(otgBServeTask,
                 (void *)0,
                 &GstkOTGBServeTask[sizeof(GstkOTGBServeTask) / sizeof(OS_STK) - 1],
                 9);


    while (1) {
        otgAServe();
        OSTimeDly(OS_TICKS_PER_SEC / 4);
    }
}


/*********************************************************************************************************
** Function name:       main
** Descriptions:        用户程序入口函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int  main (void)
{
    SystemInit();                                                       /* 系统初始化                   */


    OSInit();
    OSTaskCreate(mainTask, (void *)0, &stkMainTask[sizeof(stkMainTask) / 4 - 1], 4);
    OSStart();
}


/*********************************************************************************************************
  End Of File
*********************************************************************************************************/


USBOtgHOST.jpg
USBOtgDEVICE.jpg

(16)USB_OTG.rar

1.46 MB, 下载次数: 24, 下载积分: 威望 1

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7475
    最后登录
    2024-1-28
    发表于 2016-9-8 15:06:08 | 显示全部楼层
    好长一串
    nxp.png
    来根华子
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-13 08:29
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    531

    主题

    2048

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    210
    最后登录
    2018-8-14
    发表于 2016-9-8 17:16:01 | 显示全部楼层
    楼主 店铺信息这个就不要放了 希望理解下
    签到 签到
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    83

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    234
    最后登录
    2016-9-11
    发表于 2016-9-8 20:10:10 | 显示全部楼层
    学习下
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    11

    帖子

    0

    新手上路

    Rank: 1

    积分
    39
    最后登录
    2016-12-30
     楼主| 发表于 2016-9-9 14:11:38 | 显示全部楼层
    肖久 发表于 2016-9-8 17:16
    楼主 店铺信息这个就不要放了 希望理解下

    哦哦行
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    11

    帖子

    0

    新手上路

    Rank: 1

    积分
    39
    最后登录
    2016-12-30
     楼主| 发表于 2016-9-9 14:12:04 | 显示全部楼层

    也可以加我qq私聊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    11

    帖子

    0

    新手上路

    Rank: 1

    积分
    39
    最后登录
    2016-12-30
     楼主| 发表于 2016-9-9 14:12:26 | 显示全部楼层

    是的,自己努力写的
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-9 01:30 , Processed in 0.125411 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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