首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

USB控制51单片机有关问题

2013-09-06 
USB控制51单片机问题我现在有个CP2102的USB,有个51单片机,我想在电脑键盘上按下1健然后单片机上面P1.1的LE

USB控制51单片机问题
我现在有个CP2102的USB,有个51单片机,我想在电脑键盘上按下1健然后单片机上面P1.1的LED灯亮起来求助 单片机CP2102? 单片机 51单片机 USB控制单片机 CP2102
[解决办法]
USB转串口-> 单片机,不是容易点吗?
[解决办法]

引用:
Quote: 引用:

需要做一个上位机程序来匹配MCU内部自身的功能。上位机中键盘按下1会触发按键按下事件,通过此事件发送特殊的命令到MCU(USB协议来完成),MCU自身的程序解析此命令后进行点灯操作。你用的是那块51芯片,C8051F3xx吗?那个USB很好做,根本就不需要懂底层的USB协议

VB或者DELPHI都会做!但是就是没有头绪怎么通过USB给单片机发送指令,需要一个简单的例子


以C8051F340为例:
下位机的代码:
void main()
{
PCA0MD &= ~0x40; /* Disable Watchdog timer */
SYSCLK_Init();
USB_Clock_Start();
USB_Init(USB_VID, USB_PID, USB_MfrStr, USB_ProductStr, USB_SerialStr, USB_MaxPower, USB_PwAttributes, USB_bcdDevice);
//CLKSEL 
[解决办法]
= 0x02;
RSTSRC 
[解决办法]
= 0x02;

port_init();

ADC_VCC_ON = 1;

USB_Int_Enable();

while(1)
{
if(PacketIn) 
    {
PacketIn = 0;
Process_Receive_Data();
    }
}

}

void USB_ISR (void) interrupt 17
{
unsigned char int_val = Get_Interrupt_Source();

if (int_val & USB_RESET) /* Bus Reset Event, go to Wait State */
    {
        ms = stat_wait_dev;
    }

    if (int_val & DEVICE_OPEN) /* Device opened on host, go to Idle */
    {
        ms = stat_idle_dev;
    }

    if (int_val & TX_COMPLETE)
    {


;
    }

    if (int_val & RX_COMPLETE) /* receive complete from host */
    {
        ms = stat_decode_msg;

  PacketIn = 1;
    }

    if (int_val & DEVICE_CLOSE) // Device closed, wait for re-open
    {
        ms = stat_wait_dev;
    }

    if (int_val & FIFO_PURGE) // Fifo purged, go to Idle State
    {
        ms = stat_idle_dev;
    }
}

void Process_Receive_Data(void)
{
unsigned char temp = 0 ;

temp = Block_Read(Read_val, XH_PKT_MAXLEN);

switch(Read_val[0])
{
case 0xAA :DelaySet();  break ;
case 0xBB :     RateSel();   break ;
default :                    break ;
}

}

上位机的代码,C++ Builder写的:

int  __fastcall TForm1::WriteBytes(unsigned char bytes,unsigned char *Data)
{
unsigned char WriteBuffer[4] = {0x00};

if( bytes > 32 )
{
Memo1->Lines->Add("------------------------------------------\r\n");
Memo1->Lines->Add(" ERROR: 待写入的数据长度大于32 bytes\r\n") ;
return 255 ;
}

for(int i = 0; i < bytes; i++)
{
WriteBuffer[i] = *(Data + i) ;
}

unsigned long lpdwNumDevices;
unsigned long WriteBytes;

HANDLE Handle   ;
SI_DEVICE_STRING devStr ;

SI_STATUS state ;

state = SI_GetNumDevices(&lpdwNumDevices);
if(state != SI_SUCCESS)
{
Memo1->Lines->Add("------------------------------------------\r\n");
Memo1->Lines->Add(" ERROR: 未检测到USB设备\r\n") ;
return 1 ;     // 未检测到USB设备
}

state = SI_Open(0,&Handle);   //打开第一个USB设备
if(state != SI_SUCCESS)
{
Memo1->Lines->Add("------------------------------------------\r\n");
Memo1->Lines->Add(" ERROR: 打开USB设备失败\r\n") ;


return 2 ;     // 打开USB设备失败
}

state = SI_Write(Handle,WriteBuffer,sizeof(WriteBuffer),&WriteBytes,NULL);
if(state != SI_SUCCESS)
{
Memo1->Lines->Add("------------------------------------------\r\n");
Memo1->Lines->Add(" ERROR: 写操作失败\r\n") ;
return 3 ;     // 写操作失败
}

SI_Close(Handle) ;

return 0 ;
}

已经调试通过了的,最核心的部分都给你了,再搞不出来那就是你自己的问题了!
[解决办法]
不可以通用,但是可以借鉴。因为你的5A32S2只有串口,利用CP2102将电脑的USB转为串口之后与MCU进行通信的。而C8051F320这款MCU本身就包含有USB接口,所以上位机与下位机直接通过USB通信就可以了。所以上位机可以通用,下位机需要你自己修改,改成用串口接收数据(即初始化串口的速率,异步模式、帧格式等之后采用串口中断或者查询的方式去接收上位机传过来的数据)。另外你需要安装USBXpress_Install.exe 来获取SiUSBXp.dll、SiUSBXp.lib、SiUSBXp.h这三个文件,这三个文件包含了很多USB函数,你可以参考AN169_USBXpress_Programmers_Guide.pdf这份文档来了解这些函数如何使用。总之:上位机通过SiUSBXp.dll的API函数将数据传给CP2102,CP2102将USB数据转成串口数据传给MCU,MCU的串口接收数据。

[解决办法]
这个小例子涉及到三个部分,USB固件程序,利用已有的固件框架,在里面修改,用哪个断点,断点FIFO大小,空满标志,这些寄存器都要编程。我用的是CY7C68013A这款USB芯片,然后就是单片机控制USB芯片读写时序的引脚,这个也要编程,然后就是上位机

热点排行