從51單片機改變成串行CH375操作鍵盤鼠標,但是串口打印出來信息不對,估計是程序改的不對; get device descr failed config get config descr failed config 2 set idle report get report descr failed set report set report failed 程序是這樣的,第一個failed是出現(xiàn)在這里,我想麻煩問下可能的原因是,因為也不太了解,一人沒啥能力,麻煩了,謝謝 unsigned char get_descr_ex() { unsigned char descr_len; unsigned char *p=data_buf; endp7_mode=0x80; toggle_send(); wr_usb_data(8,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* SETUP階段操作成功 */ { endp6_mode=0xc0; toggle_recv(); } else return(0); issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* DATA階段操作成功 */ { if(flag_config_2)descr_len=data_buf[2]-rd_usb_data(data_buf); else descr_len=data_buf[0]-rd_usb_data(data_buf); while(descr_len>0) { toggle_recv(); p+=0x08; issue_token(( 0 << 4 ) | DEF_USB_PID_IN);status=wait_interrupt(); if(status==USB_INT_SUCCESS) /* DATA階段操作成功 */ descr_len-=rd_usb_data(p); else return(0); } } else return(0); endp7_mode=0xc0; toggle_send(); wr_usb_data(0,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_OUT);status=wait_interrupt(); if(status==USB_INT_SUCCESS)/* 狀態(tài)階段操作成功 */ return(1); else return(0); }
因為你修改了接口,所以你最好做一下測試命令,確保通訊正常。另外,有沒有檢測到設備的連接?確保中斷配置正確。
1測試命令通過了 2.檢測到了設備的連接 3.確保中斷配置正確?這個我認為不對, void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource7); EXTI_ClearITPendingBit(EXTI_Line7);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_Line = EXTI_Line7; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } 下降沿有效,是否可以?
中斷配置你改成檢測低電平有效,試一下?
但是stm32中斷貌似沒有低電平有效,而且我看網(wǎng)上說低電平有效沒有必要
那你改成檢測中斷引腳電平的方式來判斷中斷的產(chǎn)生。
恩恩,好的,我試試,謝謝
剛試了不行,不知道為什么,總感覺從51復制到stm32上的函數(shù)有些問題,要改又不知道是哪的問題,晚上再試,下午參加招聘會去啦,ps我投了沁恒,能問問為什么沒消息嗎,
還有一個可能,STM32是32位單片機,51是8位的在變量定義那塊有區(qū)別。你的命令沒有正確發(fā)過去,所以導致收的不對。
我把unsigned char 全改成uint8_t,unsigned int全改成uint16_t,還是不行,我想問下,測試命令通過了是否代表我的寫命令,寫數(shù)據(jù),讀數(shù)據(jù)程序是對的?
在get_descr_ex()里setup階段status==USB_INT_SUCCESS操作成功,但是DATA階段status不等于USB_INT_SUCCESS操作不成功,會是什么原因呢
在這中間有產(chǎn)生中斷嗎?
測試命令你發(fā)0x55返回0xAA,發(fā)0xAA返回0x55,這樣如果測試 通過說明三個讀寫子函數(shù)沒有問題了。在setup階段返回0x14說明命令下發(fā)成功了,DATA階段不成功說明沒有收到設備的數(shù)據(jù)。中間會產(chǎn)生中斷。
unsigned char idata data_buf[96];//描述符緩沖區(qū)可以適當減小,這個數(shù)組怎么看不到怎樣賦值的奇怪
“測試命令你發(fā)0x55返回0xAA,發(fā)0xAA返回0x55,這樣如果測試 通過說明三個讀寫子函數(shù)沒有問題了。在setup階段返回0x14說明命令下發(fā)成功了,DATA階段不成功說明沒有收到設備的數(shù)據(jù)。中間會產(chǎn)生中斷?!比齻€讀寫子函數(shù)沒有問題。沒有收到設備的數(shù)據(jù)??什么意思呢,如果讀寫沒錯誤,應該能讀到函數(shù)的數(shù)據(jù)啊
在獲取描述符里不是有rd_usb_data(data_buf);來獲取數(shù)據(jù)嗎?數(shù)據(jù)傳輸?shù)臅r候需要切換同步標志,如果沒有切換傳輸也會失敗的。