看到这里,俺也说两句,按看中了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,这个应该是非常健壮的,我只移植了与芯唐接口有关的硬件部分
由于录像太大,上传不容易,暂时,不上传。 |