📄 tm.c
字号:
//CH372外部固件模式 命令子函数 默认在24MHz下
#include <REG52.h>
#include <intrins.h>
#include <CH375INC.H>
#include <custom_define.h>
#include <usb_descriptor.h>
#include <stdio.h>
//#ifndef DELAY_CONSTANT
//#define DELAY_CONSTANT
//#endif
/*sbit KEY= P3^3;
sbit LED4= P1^4;
sbit LED5= P1^5;
sbit LED6= P1^6;
sbit LED7= P1^7;
*/
UINT8 int_status;
//bit flag_err_unknownsetup;
//UINT8 data_buf[8];
union _ep0_data
{
UINT8 data_buf[8];
struct
{
UINT8 bmRequestType; //标准请求字
UINT8 bRequest; //请求代码
UINT16 wValue; //特性选择高
UINT16 wIndx; //索引
UINT16 wLength; //数据长度
}device_request;
}ep0_data;
struct _desc_info
{
UINT8 desc_type;
UINT8 desc_index;
UINT8 desc_length;
}desc_info;
void intt1() interrupt 2 //using 1
{
UINT8 status_temp,ep0_data_len,requesttype_temp,usb_address;
IE1=0;
status_temp=CH37x_get_status();
switch(status_temp)
{
case(USB_INT_EP0_SETUP):
case(USB_INT_EP0_OUT):break;
case(USB_INT_EP0_IN):
case(USB_INT_EP1_OUT):break;
case(USB_INT_EP1_IN):break;
case(USB_INT_EP2_OUT):break;
case(USB_INT_EP2_IN):break;
case(USB_INT_BUS_RESET1):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
case(USB_INT_BUS_RESET2):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
case(USB_INT_BUS_RESET3):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
case(USB_INT_BUS_RESET4):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
default:break;//return stall
}
}
CH37x_unlock_usb();
}
void delay()
{;}
void delay20us()
{ UINT8 ms=40; //24MHz
while(ms--);
}
/*void delay1ms()
{ UINT8 ms,sm;
for ( ms=4; ms!=0; ms-- )
{ sm=250;
while(--sm);
}
}*/
void delayms(UINT8 delay)
{ UINT8 ms,sm,c;
for(ms=delay;ms!=0;ms--)
{ for(sm=200;sm!=0;sm--)c+=3; /* 在24MHz时钟下延时500uS */
for(sm=200;sm!=0;sm--)c+=3; /* 在24MHz时钟下延时500uS */
}
}
bit temp_bit;
void init_CH37x()
{ //flag_err_unknownsetup=0;
flag_return_desc=0;
flag_configured=0;
flag_set_add=0;
flag_report_input=0;
L6=1;
do{
temp_bit=CH37x_set_usb_mode(0x01);
_nop_();
L6=0;
}
while(temp_bit!=SUCCESS);
L6=1;
/*L7=0;
delayms(50);
delayms(50);
delayms(50);
delayms(50);
delayms(50);
L7=1;*/
}
/*void CH37x_reset_all()
{ UINT8 i;
CH375_CMD_PORT=CMD_RESET_ALL;
i=40;
while(i--)delay1ms();
}*/
//void CH37x_check_exist(){;}
//void Set_usb_id(){;}
bit CH37x_set_usb_mode(UINT8 mode)
{
CH375_WR_CMD_PORT(CMD_SET_USB_MODE);
delay();
CH375_WR_DAT_PORT(mode);
delay20us();
if(CH375_RD_DAT_PORT()==CMD_RET_SUCCESS)
return(SUCCESS);
else
return(ABORT);
}
UINT8 CH37x_get_status()
{
CH375_WR_CMD_PORT(CMD_GET_STATUS);
delay();
return(CH375_RD_DAT_PORT());
}
void CH37x_unlock_usb()
{
CH375_WR_CMD_PORT(CMD_UNLOCK_USB);
delay();
}
UINT8 CH37x_rd_usb_data()
{
UINT8 data_len,data_len_temp;
UINT8 *data_buf_r=ep0_data.data_buf;
CH375_WR_CMD_PORT(CMD_RD_USB_DATA);
delay();
data_len_temp=data_len=CH375_RD_DAT_PORT();
while(data_len)
{
*data_buf_r=CH375_RD_DAT_PORT();
data_buf_r++;
data_len--;
}
return(data_len_temp);
}
void CH37x_wr_usb_data5(UINT8 data_len)
{
UINT8 *data_buf_w=ep0_data.data_buf;
CH375_WR_CMD_PORT(CMD_WR_USB_DATA5);
delay();
CH375_WR_DAT_PORT(data_len);
while(data_len)
{
CH375_WR_DAT_PORT(*data_buf_w);
data_buf_w++;
data_len--;
}
}
/*void CH37x_wr_usb_data7(UINT8 data_len)
{ UINT8 *data_buf_w=ep0_data.data_buf;
CH375_CMD_PORT=CMD_WR_USB_DATA7;
delay();
CH375_DAT_PORT=data_len;
while(data_len)
{ CH375_DAT_PORT=*data_buf_w;
data_buf_w++;
data_len--;
}
}
*/
void CH37x_set_usb_addr(UINT8 address)
{
CH375_WR_CMD_PORT(CMD_SET_USB_ADDR);
delay();
CH375_WR_DAT_PORT(address);
}
/*void CH37x_set_endp2(UINT8 mode_2)
{ UINT8 i=8;
CH375_CMD_PORT=CMD_SET_ENDP2;
delay();
CH375_DAT_PORT=mode_2;
while(i--);
}*/
void CH37x_set_endp3(UINT8 mode_3)
{
UINT8 i=8;
CH375_WR_CMD_PORT(CMD_SET_ENDP3);
delay();
CH375_WR_DAT_PORT(mode_3);
while(i--);
}
void CH37x_set_endp4(UINT8 mode_4)
{
UINT8 i=8;
CH375_WR_CMD_PORT(CMD_SET_ENDP4);
delay();
CH375_WR_DAT_PORT(mode_4);
while(i--);
}
void CH37x_set_endp5(UINT8 mode_5)
{
UINT8 i=8;
CH375_WR_CMD_PORT(CMD_SET_ENDP5);
delay();
CH375_WR_DAT_PORT(mode_5);
while(i--);
}
void CH37x_set_endp6(UINT8 mode_6)
{
UINT8 i=8;
CH375_WR_CMD_PORT(CMD_SET_ENDP6);
delay();
CH375_WR_DAT_PORT(mode_6);
while(i--);
}
void CH37x_set_endp7(UINT8 mode_7)
{
UINT8 i=8;
CH375_WR_CMD_PORT(CMD_SET_ENDP7);
delay();
CH375_WR_DAT_PORT(mode_7);
while(i--);
}
/*UINT8 CH37x_get_toggle()
{ CH375_CMD_PORT=CMD_GET_TOGGLE;
delay();
CH375_DAT_PORT=0x1A;
delay();
return(CH375_DAT_PORT);
}*/
void CH37x_wr_usb_data3(UINT8 data_len)
{
UINT8 *data_buf_w=ep0_data.data_buf;
CH375_WR_CMD_PORT(CMD_WR_USB_DATA3);
delay();
CH375_WR_DAT_PORT(data_len);
while(data_len)
{
CH375_WR_DAT_PORT(*data_buf_w);
data_buf_w++;
data_len--;
}
}
void CH37x_return_desc()
{
UINT8 i=0,j;
if(flag_return_desc)
{
if(desc_info.desc_length>8)
{
for(j=8;j!=0;j--)ep0_data.data_buf[i++]=*p_desc_type++;
desc_info.desc_length-=8;
CH37x_wr_usb_data3(8);
}
else//(desc_info.desc_length<=8)
{
for(j=desc_info.desc_length;j!=0;j--)ep0_data.data_buf[i++]=*p_desc_type++;
CH37x_wr_usb_data3(desc_info.desc_length);
desc_info.desc_length=0;
flag_return_desc=0;
}
}
}
void init_stdio()
{
SCON = 0x50;
PCON = 0x80;
TMOD = 0x20;
TH1 = 0xf3; /* 24MHz晶振, 9600bps */
TR1 = 1;
TI = 1;
}
unsigned char left_pressed;
unsigned char right_pressed;
main()
{
UINT8 te,pe;
LED4=0;LED5=0;LED6=0;LED7=0;
delayms(50);
LED4=1;LED5=1;LED6=1;LED7=1;
init_CH37x();
init_stdio();
IT0=0;
IE1=0;
EX1=1;
EA=1;
left_pressed=0;
right_pressed=0;
printf( "test\n" );
do
{
LED6=1;
//P1=test_temp;
delayms(250);
do
{
if(flag_report_input)
{
if(!SW10) //up
{
for(te=50;te!=0;te--)
{
ep0_data.data_buf[0]=0x00;
ep0_data.data_buf[1]=report_x=0;
ep0_data.data_buf[2]=report_y=0xff;
CH37x_wr_usb_data5(3);
}
}
if(!SW7) //down
{
for(te=50;te!=0;te--)
{
ep0_data.data_buf[0]=0x00;
ep0_data.data_buf[1]=report_x=0;
ep0_data.data_buf[2]=report_y=0x1;
CH37x_wr_usb_data5(3);
}
}
if(!SW6) //right
{
for(te=50;te!=0;te--)
{
ep0_data.data_buf[0]=0x00;
ep0_data.data_buf[1]=report_x=1;
ep0_data.data_buf[2]=report_y=0;
CH37x_wr_usb_data5(3);
}
}
if(!SW8) //left
{
for(te=50;te!=0;te--)
{
ep0_data.data_buf[0]=0x00;
ep0_data.data_buf[1]=report_x=0xff;
ep0_data.data_buf[2]=report_y=0;
CH37x_wr_usb_data5(3);
}
}
if(!SW11 && !left_pressed) //left key down
{
ep0_data.data_buf[0]=0x01;
ep0_data.data_buf[1]=report_x=0;
ep0_data.data_buf[2]=report_y=0;
CH37x_wr_usb_data5(3);
left_pressed=1;
}
else if(SW11 && left_pressed)
{ //left key up
ep0_data.data_buf[0]=0x00;
ep0_data.data_buf[1]=report_x=0;
ep0_data.data_buf[2]=report_y=0;
CH37x_wr_usb_data5(3);
left_pressed=0;
}
if(!SW9 && !right_pressed) //right key down
{
ep0_data.data_buf[0]=0x02;
ep0_data.data_buf[1]=report_x=0;
ep0_data.data_buf[2]=report_y=0;
CH37x_wr_usb_data5(3);
right_pressed=1;
}
else if(SW9 && right_pressed)
{ //right key up
ep0_data.data_buf[0]=0x00;
ep0_data.data_buf[1]=report_x=0;
ep0_data.data_buf[2]=report_y=0;
CH37x_wr_usb_data5(3);
right_pressed=0;
}
// flag_report_input=0;
//LED6=0;
}
}while(1);
for(te=test_count;te!=0;te--)
{
printf("%02X,",(UINT16)test_buf[pe]);
pe++;
} }while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -