打印
[新手园地]

问一个傻问题——NUC120能干什么?

[复制链接]
楼主: 程序匠人
手机看帖
扫描二维码
随时随地手机跟帖
61
logics| | 2011-8-17 11:20 | 只看该作者 回帖奖励 |倒序浏览
看来:
匠人是才华横溢的老“文学青年”,
九哥是含而不露的隐性“文学青年”,
菜农则是努力成长的新“文学青年”。

使用特权

评论回复
62
murex| | 2011-8-18 09:02 | 只看该作者
菜农越来越年轻了

使用特权

评论回复
63
athud| | 2011-8-18 10:44 | 只看该作者
不错的芯片.

使用特权

评论回复
64
flywater2010| | 2011-8-19 09:49 | 只看该作者
M0516LAN片子去年就买了几片,现在还在躺着。由于是新东西,斟酌再三,产品上没敢用它,而选用了LPC系列,看大家对它如此看好,决心改变思路,改用性价比高的M0...

使用特权

评论回复
65
zhifeng| | 2011-8-24 13:03 | 只看该作者
看到这里,俺也说两句,按看中了nuc120的宽电压。但应用中遇到莫名其妙的问题。让俺无所适从。

下面是出现的问题
最近再搞nuc120的芯片,反反复复的试,无论是使用hid中断传输,还是使用特性传输,in 数据总是有问题。目前,在下判断此芯片有可能存在问题,在5v下工作出错的概率非常的大,在3.3下几乎不在出现错误。l

    另外,上位机软件使用我们非常成熟的progisp/powerprg 软件,几乎可以排除此处出问题的可能,再说从监视软件显示错位的结果,就是nuc120芯片没有发送包上来,具体,没有usb硬件调试工具,还不敢下定论。

    具体情况需要进一步确认,星期一,看看能不能找到芯唐的技术人员,看看到底咋回事?

bus hound 监视    出错提示 USTS c0000005 no response   

我已反映到他们代理商的一个技术支持那里了,我将usb部分的源程序,与遇到情况的录像都发给他了,目前,还没有结果。

你先不要急,这个问题很特殊,等我描述清楚,你再回复
V 9:27:14  
你先说下具体情况吧
智峰软件 9:34:47  
你收下这个
智峰软件 9:35:08  
你看看这个录像,就容易理解了
智峰软件 9:40:22  
我现在是用nuc120 制作的下载器,操作对avr芯片的读写。如果avr芯片是空的,那么读出芯片的数据都是0xff,这时nuc120的usb通讯是正常了,如果avr芯片为非空的,也就是说读出有可能是非0xff,这时,nuc120的usb就出错了。  我是isp模式操作的,也就是miso的口线电平会变化,反映到nuc120上面就是唯一的一个io口的电平会变化,这时就干扰了nuc120 usb通讯出错。
智峰软件 9:44:11  
出现这个问题是随机的。这个问题,很是头疼,我已经搞了很久了。没有进展,最终追踪到nuc  usb不响应中断,我没有usb硬件调试器,无法往下查。
智峰软件 9:45:57  
我用usb hid 中断模式也写了一个版本的,结果和这个差不多。都是,in报告出错。而且都是随机的。我使用过,官方驱动。现在这个驱动是我从keil中移植的。结果都是一样的
智峰软件 9:47:16  
因此,我在怀疑,是不是芯唐这个芯片此处有些问题?要不,不会出现这种奇怪的问题
V 9:50:45  
好的,我先看下
智峰软件 9:52:32  
void U_spi ( unsigned char * cmd, unsigned char * res, unsigned char n )
{
    unsigned char rec_byte,send_byte;
    unsigned char i;

    while (n != 0)
    {
        n--;
        send_byte = *cmd++;
        rec_byte = 0;
        for (i = 0; i < 8; i++)
        {

            /* set MSB to MOSI-pin */
            if ((send_byte & 0x80) != 0)
            {
                ISP_MOSI;  /* MOSI high */
            }
            else
            {
                ISP_MOSI0; /* MOSI low */
            }
            /* shift to next bit */
            send_byte  = send_byte << 1;

            /* receive data */
            rec_byte = rec_byte << 1;
            if (ISP_MISO_I)
            {
                rec_byte++;
            }

            /* pulse SCK */
            ISP_SCK;     /* SCK high */
            Delay(sck_period);
            ISP_SCK0;    /* SCK low */
            Delay(sck_period);
        }
        *res++ = rec_byte;
    }
}
智峰软件 9:53:11  
//#define  ISP_XTAL      (GPIOA->DOUT | (1<<0))
#define  ISP_RST       (GPIOD->DOUT |= (1<<0))
#define  ISP_MOSI      (GPIOD->DOUT |= (1<<3))
#define  ISP_MISO      (GPIOD->DOUT |= (1<<2))
#define  ISP_SCK       (GPIOD->DOUT |= (1<<1))
//#define  ISP_ICP       (GPIOA->DOUT | (1<<0))
#define  ISP_RXD       (GPIOB->DOUT |= (1<<0))
#define  ISP_TXD       (GPIOB->DOUT |= (1<<1))

//#define  ISP_XTAL0      (GPIOA->DOUT & (~(1<<0)))
#define  ISP_RST0       (GPIOD->DOUT &= (~(1<<0)))
#define  ISP_MOSI0      (GPIOD->DOUT &= (~(1<<3)))
#define  ISP_MISO0      (GPIOD->DOUT &= (~(1<<2)))
#define  ISP_SCK0       (GPIOD->DOUT &= (~(1<<1)))
//#define  ISP_ICP0       (GPIOA->DOUT & (~(1<<0)))
#define  ISP_RXD0       (GPIOB->DOUT &= (~(1<<0)))
#define  ISP_TXD0       (GPIOB->DOUT &= (~(1<<1)))

#define  ISP_MISO_I     (GPIOD->PIN & (1<<2))

//#define  ISP_XTAL_D    GPIOA->PMD.PMD0
#define  ISP_RST_D     GPIOD->PMD.PMD0
#define  ISP_MOSI_D    GPIOD->PMD.PMD3
#define  ISP_MISO_D    GPIOD->PMD.PMD2
#define  ISP_SCK_D     GPIOD->PMD.PMD1
//#define  ISP_ICP_D     GPIOA->PMD.PMD0
#define  ISP_RXD_D     GPIOB->PMD.PMD0
#define  ISP_TXD_D     GPIOB->PMD.PMD1
智峰软件 9:53:38  
io口部分操作与定义
10:04:57
成功发送文件“DSCF0685.avi”(86.36MB)。  
     

V 10:51:50  
你使用IO口的电平变化作为中断源的吗?IO口电平变化最快为7个时钟周期,这里要注意下
智峰软件 10:52:34  
没有
V 10:53:24  
IO口和USB是什么关系?
智峰软件 10:53:33  

void enableprog(unsigned Rst,unsigned char speed)
{
    if(Rst)
        ISP_RST;
    else
        ISP_RST0;

    ISP_RST_D=1;
    ISP_MOSI_D=1;
    ISP_MISO_D=0;
    ISP_SCK_D=1;

    sck_period = speed;                   //ËÙ¶È
}
智峰软件 10:53:41  
没有关系
智峰软件 10:53:56  
根据前面定义
智峰软件 10:54:15  
只是使用普通io口而已
V 10:59:26  
IO口模拟的SPI和AVR链接的吗?
智峰软件 10:59:42  

V 11:00:17  
然后把SPI的数据通过USB传输?
智峰软件 11:00:32  

V 11:01:12  
你有没有单独测试下SPI通讯是不是正常的呢?
智峰软件 11:01:32  
模拟的
V 11:03:05  
恩,我的意思就是你直接操作模拟的SPI,控制AVR读取数据,看是否正常。确定下是SPI通讯错误还是USB通讯错误
智峰软件 11:03:44  
正常的,这块不用怀疑
智峰软件 11:04:18  
你看到录像没有,是usb崩溃了
智峰软件 11:04:53  
从上微机测试是23号错误
智峰软件 11:06:51  
如果,芯片空与非空,模拟的spi只有一个地方不一样,就是miso这个线有出现低电平的情况,余下是完全一样的


智峰软件 11:08:01  
如果是你说的spi通讯错误,在空芯片时是也会发生错误的,但现在是这种情况是不出错的
V 11:09:41  
如果为非空,你是读取数据,还是只是用一个状态表示非空?
智峰软件 11:11:15  
你看到我上面贴的函数吗
智峰软件 11:11:54  
读出数据,就是放到缓冲,然后通过usb传给pc就结束了
智峰软件 11:15:43  
你说的io口中断是不是芯片上的默认的,如何关闭?
V 11:16:10  
IO口默认不开中断
智峰软件 11:16:28  
那就不是这个问题
智峰软件 11:16:56  
    uint8_t Alert=0;


    //    extern uint32_t SystemFrequency;
    SysTick_Config(SystemCoreClock/100);  /* Generate interrupt each 10 ms      */

    UNLOCKREG();

    SYSCLK->PWRCON.XTL12M_EN = 1;
    //SYSCLK->PWRCON.OSC22M_EN = 1;
    /* Waiting for 12M Xtal stalble */
    Delay(500);
    //    FMC->ISPCON.ISPEN = 1;

    /* Enable PLL */
    SYSCLK->PLLCON.OE = 0;
    SYSCLK->PLLCON.PD = 0;
    Delay(100);

    SYSCLK->CLKSEL0.HCLK_S = 2;
SystemCoreClockUpdate();
LOCKREG();

//    Delay(10);

    outpw((uint32_t)&GPIOA->PMD,0x00);
    outpw((uint32_t)&GPIOB->PMD,0x00);
    outpw((uint32_t)&GPIOC->PMD,0x00);
    outpw((uint32_t)&GPIOD->PMD,0x00);
    outpw((uint32_t)&GPIOE->PMD,0x00);


    GPIOA->DOUT=0x0000;
    GPIOB->DOUT=0x0000;
    GPIOC->DOUT=0x0000;
    GPIOD->DOUT=0x0000;
    GPIOE->DOUT=0x0000;

    SPEAK_D=1;
    SPEAKON;
    P5V_3V_D=1;
    P5V_3VOFF;
    POWER_D=1;
    POWERON;


    ISP_GRN_D=1;
    ISP_RED_D=1;
    ISP_GRNON;
    ISP_REDOFF;

    SpeakTime=20;
    Timer1.Count=SpeakTime;
    Timer1.Flag=1;

//    ADC_init();                           /* ADC Initialization                 */

    UsbHid();


智峰软件 11:17:38  
初始化。只做这些事
智峰软件 11:30:43  
我现在是没有办法了,不行,我准备采用bulk通讯方式了
智峰软件 11:33:10  
我有不想让用户装驱动。所以,我现在有个想法,能否,模拟一个u盘设备,利用windows自带的驱动,进行读写,目前,上位机我还没有找到合适的方法来与nuc120 通讯
V 11:33:10  
[自动回复]您好,我现在有事不在,一会再和您联系。
智峰软件 11:35:56  
模拟 usb MassStorage ,然后通过读写 MassStorage 设备,来转换。不知你熟悉这块吗?给提个建议。就是,上位机如何打开MassStorage设备,并读写?
智峰软件 11:37:07  
这种方式再有问题,只能放弃nuc了,我在这个上面耗了很多精力了。
V 11:54:56  
你前面的方式不用了,换成U盘模式?
智峰软件 11:55:29  
有这个想法
智峰软件 11:55:52  
问题,解决不掉,就换个路子走
智峰软件 11:57:28  
主要是想做出的产品,不需要用户安装驱动。所以选择,usb MassStorage 模式
智峰软件 11:58:11  
现在的问题是上位机的程序,我需要重新写?以前的,上位机是成熟的
智峰软件 11:58:49  
仅需小小改动就可以了。
智峰软件 11:59:37  
上位机,重新来,工作量也是很大的
V 15:33:13  
能否把你的USB中断函数发给我看下
智峰软件 15:36:37  

/********************************************************************************************************//**
* @brief     USB Interrupt Service Routine
* @param[in] None
* @return    None
************************************************************************************************************/
void USB_IRQHandler (void)
{
uint32_t disr,ep,ep_state,i;
uint32_t usb_state,u32PacketType;

disr = (*((__I  uint32_t *) (&USBD->EVF)));                      /* Device Interrupt Status */
if(disr & EVF_FLD)
{
//uint8_t u8FLODET = USBD->FLODET.FLODET;
_DRVUSB_SET_EVF(EVF_FLD);
return;
}
else if (disr & EVF_WAKEUP)
{
USB_WakeUp();
#if     USB_WAKEUP_EVENT
if(USB_WakeUp_Event!= NULL)
{
USB_WakeUp_Event();
}
#endif
}
/* Device Status Interrupt (Reset, Connect change, Suspend/Resume) */
else if (disr & EVF_BUS)
{
uint8_t u8ATTR = *((__IO uint32_t *)(&USBD->ATTR)) & 0xFF;
_DRVUSB_SET_EVF(EVF_BUS);
if (u8ATTR & ATTR_USBRST)
{                    /* Reset */
_DRVUSB_ENABLE_USB();
USB_Reset();
#if    USB_RESET_EVENT

USB_Reset_Event();
#endif
}
else if (u8ATTR & ATTR_SUSPEND)
{                  /* Suspend */
USB_Suspend();
#if      USB_SUSPEND_EVENT
if(USB_Suspend_Event!=NULL)
{
USB_Suspend_Event();
}
#endif
}
else if (u8ATTR & ATTR_RESUME)
{                              /* Resume */
USB_Resume();
#if         USB_RESUME_EVENT
if(USB_Resume_Event!=NULL)
{
USB_Resume_Event();
}
#endif
}
//}
return;
}

#if USB_SOF_EVENT
/* Start of Frame Interrupt */

#endif

#if USB_ERROR_EVENT
/* NO error interrupt anymore, below code can be used
as example to get error status from command engine. */
/* Error Interrupt */
#endif

/* Endpoint's Interrupt */
else if (disr & EVF_USB)
{

    usb_state = _DRVUSB_GET_STS();

/* Control OUT Endpoint */
if (disr & EVF_SETUP)
{         /* Setup Packet */
            USB_P_EP[0](USB_EVT_SETUP);
}

    disr = (*((__I  uint32_t *) (&USBD->EVF)));                      /* Device Interrupt Status */

_DRVUSB_SET_EVF(disr&EVF_SETUP);

    for(i=0;i<USB_EP_NUM;i++)
    {
        if(disr & (1<<(i+16)))
        {
//             _DRVUSB_SET_EVF(1<<(16+i)&disr);
        ep = USBD->EP[i].CFG.EPT;
        ep_state = USBD->EP[i].CFG.STATE;
#if 1
u32PacketType = (usb_state >> (4+ i*3)) & STS_STS;
switch(u32PacketType)
{
case STS_IN_ACK: /* 000: In ACK */
     USB_P_EP[ep](USB_EVT_IN);
  break;
case STS_IN_NAK: /* 001: In NAK */
break;
case STS_OUT0_ACK:      /* 010: Out 0 ACK */
case STS_OUT1_ACK:      /* 110: Out 1 ACK */
             USB_P_EP[ep](USB_EVT_OUT);              
break;
case STS_SETUP_ACK:      /* 011: Setup ACK */
break;
case STS_ISO:          /* 111: Isochronous translation end */
break;
default:
             USB_P_EP[ep](USB_EVT_IN_STALL);              
break;
}
#else

if(ep_state == 0x02)
USB_P_EP[ep](USB_EVT_IN);
else
        USB_P_EP[ep](USB_EVT_OUT);              
#endif
            _DRVUSB_SET_EVF(1<<(16+i)&disr);
        }
    }
}
return;
}

智峰软件 15:37:51  
这样吧,我将usb部分打包发给你
15:40:10
成功发送文件“myusbtest.rar”(23.00KB)。  
     

智峰软件 15:40:50  
我认为应该不是驱动问题,如果是,你怎能解释,上午和你说的那个现象
智峰软件 15:41:23  
正常通讯,如果,芯片为空,我这从没出过错
智峰软件 15:42:32  
要不,你那边提供个稳定的驱动,我试试,我需要usbhid 自定义模式的。芯唐例程,我没找到有
智峰软件 15:43:40  
底层驱动是来源于keil,这个应该是非常健壮的,我只移植了与芯唐接口有关的硬件部分

由于录像太大,上传不容易,暂时,不上传。

使用特权

评论回复
66
lxyppc| | 2011-8-25 18:03 | 只看该作者
楼上遇到的是个好问题
我的猜测
新塘USB的硬件应该是没有问题的,因为这个一般是买的别人的IP
我觉得可能性最大的是新塘的USB驱动层出现了问题.状态机处理没考虑好.
ST声称他的USB库是经过了USB IF认证的,不知道新塘以后会不会去过认证
能用的USB的设备不一定能过USB IF的认证.
Windows对USB的标准执行不严格,所以很多时候能用不一定就是正确的

建议不用新塘的USB库,用裸奔的方式

使用特权

评论回复
67
john_lee| | 2011-8-25 20:55 | 只看该作者
据酒鬼说,新唐USB的IP是自己设计的。

使用特权

评论回复
68
zhifeng| | 2011-8-25 21:56 | 只看该作者
本帖最后由 zhifeng 于 2011-8-25 22:03 编辑

楼上猜测不对,我使用过芯唐的库,后来,有从新写了usb部分程序,结果是一样滴。如果是驱动问题,不可能会有这种现象。

我现在有95%以上的把握是芯片的问题,同样的程序仅仅是io更换下,在48脚的芯片上测试,没有此种问题。

    另外,100脚芯片出现问题也是在5v状态下,3.3v 也不出问题。

使用特权

评论回复
69
star_bkb| | 2011-8-26 13:53 | 只看该作者
哇。。。。。好多强人呀。。。。

使用特权

评论回复
70
sinanjj| | 2011-8-26 22:36 | 只看该作者
用nxp的飘过.

使用特权

评论回复
71
缥缈九哥| | 2011-8-27 10:22 | 只看该作者
也许是你用的BSP包的API的缘故。我知道酒鬼做的新唐 M0的仿真下载烧录器NU-LINK就是用NUC120RE3AN及HID的。非常稳定 可靠。非常好用。

使用特权

评论回复
72
yjf1979yjf| | 2011-8-27 10:56 | 只看该作者
胡扯吧 什么这好那好  胡吹用在PLC上  台湾厂家的东西一般都比欧镁次很多   就酸是匠人 和所谓的大虾门  也没必要胡吹 还说为了学USB才用MO  才是狗屁呢  有USB的ARM7 COTEX M3 一大堆  说的振振有词的  不知道是不是丢死人   没必要为了说他好就牵强附会来说   做技术的人要讲实话  要实事求是  真是难为那些大虾门了  绝对是高铁的一套水准

使用特权

评论回复
73
linqing171| | 2011-8-27 17:58 | 只看该作者
感觉67楼的,最大可能是电源问题,仔细的先排除一下。
另外,没有用过120的人路过,因为偶做的产品差一个内置温度传感器。

看到现在,发现只有楼上的被九哥的语气激怒了,欠和谐啊。

使用特权

评论回复
74
weshiluwei6| | 2011-8-27 21:30 | 只看该作者
讨论的很经典 学习了

使用特权

评论回复
75
红舞林檬浩| | 2011-8-27 22:05 | 只看该作者
好深奥啊

使用特权

评论回复
76
linbei1988| | 2011-8-28 09:23 | 只看该作者
和欧美的比确实差个档次。。可是价格不也差个档次么

使用特权

评论回复
77
zhifeng| | 2011-8-28 15:03 | 只看该作者
上面我已说过,注意是100脚的芯片有问题,另外,所有的例子都是hid 中断模式的,而且,是不停的往pc发数据包的,即使丢了几包数据,不影响‘M0的仿真下载烧录器NU-LINK“的功能,具体,大家可以测试。要测试100的芯片,电源电源一定要在芯片加到5v,不要通过usb供电中间加个二极管,这样,就不够5v,否则,测试没有意义,这种情况不会出现问题,你只会怀疑我瞎掰。

使用特权

评论回复
78
zhifeng| | 2011-8-28 15:08 | 只看该作者
我想既然宣传能够支持5.5v,我有时间就加到5.5v测试,这个应该与电压有关系的。我希望是我出问题了,这样,我这个项目还能进行下去,要不,白白的花了2个月时间,就浪费掉了

使用特权

评论回复
79
zhonghui88| | 2011-8-28 22:54 | 只看该作者
过来学习霸气,看到Lz面试的第一家公司,想到我老家隔壁家那哥们在上海的sim总部已经几年了...

使用特权

评论回复
80
rootxie| | 2011-8-30 12:09 | 只看该作者
唉,感觉同价位的120和STM32比,还是没有价格优势!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则