USB控制51单片机问题
我现在有个CP2102的USB,有个51单片机,我想在电脑键盘上按下1健然后单片机上面P1.1的LED灯亮起来求助 单片机CP2102? 单片机 51单片机 USB控制单片机 CP2102
[解决办法]
USB转串口-> 单片机,不是容易点吗?
[解决办法]
;
}
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芯片读写时序的引脚,这个也要编程,然后就是上位机