前言:之前在使用STC8H芯片做项目的时候发现,该款STC芯片,已经支持了USB功能,每次传输的字节只要不超过64字节就可以,内部还有几个缓冲区供客户使用,可以满足日常的需求。
下面我简单的介绍下自己的设计思路:
1:主控部分
使用STC8H做为主控,设计的时候只需要注意将引脚8设置一个1uf电容,引脚9设计的电阻就可以。由于没有太多的功能,所以选用的LQFP_32封装就可以,这样还有很多引脚没有用到,在外扩功能的时候也是可以满足要求的。
2:下载程序接口
由于使用P3.0和P3.1做为USB的接口,但是芯片初次下载程序的使用也是需要这两个接口的,务必将这下载接口引出,否则程序下载就会出现问题。
3:电源部分,按键部分。
以上两个部分是预留的无线通讯功能,选用的是E32-400T20S芯片。手册上面介绍的在空旷地方传输距离可以达到3km,穿墙能力也是满强的,这样调试起来就会方便很多,再也不需要太多的线缆了。
4:状态显示部分:
显示程序是否正常运行,主机从机的状态显示。
二:软件部分:
串口初始化:
//========================================================================
// 函数: void UART2_config(u8 brt)
// 描述: UART2初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART2_config(u8 brt) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
{
/*********** 波特率固定使用定时器2 *****************/
if(brt == 2)
{
SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate2);
S2CON &= ~(1<<7); // 8位数据, 1位起始位, 1位停止位, 无校验
IE2 |= 1; //允许中断
S2CON |= (1<<4); //允许接收
P_SW2 &= ~0x01;
P_SW2 |= 0; //UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7
B_TX2_Busy = 0;
TX2_Cnt = 0;
RX2_Cnt = 0;
}
}
芯片进入HID模式代码:
//========================================================================
// 函数: void KeyResetScan(void)
// 描述: P3.2口按键长按1秒触发软件复位,进入USB下载模式。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-11
// 备注:
//========================================================================
void KeyResetScan(void)
{
if(!P32)
{
if(!Key_Flag)
{
Key_cnt++;
if(Key_cnt >= 1000) //连续1000ms有效按键检测
{
Key_Flag = 1; //设置按键状态,防止重复触发
USBCON = 0x00; //清除USB设置
USBCLK = 0x00;
IRC48MCR = 0x00;
delay_ms(10);
IAP_CONTR = 0x60; //触发软件复位,从ISP开始执行
while (1);
}
}
}
else
{
Key_cnt = 0;
Key_Flag = 0;
}
}
主程序:
while (1)
{
delay_ms(1);
KeyResetScan(); //长按P3.2口按键触发软件复位,进入USB下载模式,不需要此功能可删除本行代码
if(DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
//// HostLED = 0 ;
//// else
//// SlaveLED = 0 ;
continue;
/***************************主机调用函数部分*********************************/
if (bUsbOutReady)
{
HostLED = 0 ;
SlaveLED = 1 ;
usb_OUT_done(); //接收应答(固定格式)
/*通过串口2将USB需要发送的数据发送到无线模块*/
for(SendPoint = 0 ; SendPoint <OutNumber ;SendPoint++ )
{
UART2_TxByte(UsbOutBuffer[SendPoint] );
}
}
// else
// {
//
// HostLED = 1 ;
// SlaveLED = 0 ;
//
//
// }
if(Rx2_Pack_Flag) //收到数据, 发送空闲
{
Rx2_Pack_Flag = 0 ;
USB_SendData(RX2_Buffer,RX2_Cnt);
RX2_Cnt = 0 ;
}
}
实物图片如下:
调试视频:由于初版只是实现了USB转TTL的功能,后期增加了无线通讯的功能,再将设计资料上传。
全部评论