一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于APM32E103的USB Printer實(shí)現(xiàn)方案

Geehy極海半導(dǎo)體 ? 來源:21ic論壇極海半導(dǎo)體專區(qū) ? 2025-05-23 10:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源:轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū)

目前官方SDK的USB設(shè)備例程“APM32E10x_EVAL_SDK_v1.0”只有這幾個(gè),分別是:

CDC類 虛擬串口 “USB_CDC_VirtualCOMPort”

HID類 鼠標(biāo) “USB_HID_Mouse”

MCS類 大容量存儲(chǔ) “USB_MSC_Disk”

上面是沒有Printer類的,如果需要打印機(jī)類,可以在CDC例程的基礎(chǔ)上進(jìn)行修改,只需要幾步就可以實(shí)現(xiàn)一個(gè)USB的打印機(jī)設(shè)備。

1、USB打印機(jī)類的基礎(chǔ)知識(shí)

1.1、USB的設(shè)備類

常見的USB設(shè)備類有以下幾種,這里要實(shí)現(xiàn)就是07h號(hào)打印機(jī)類。

a1ba8dc0-354c-11f0-afc8-92fbcf53809c.png

1.2、調(diào)試USB的工具軟件

USB數(shù)據(jù)抓包軟件 “Bus Hound”

枚舉信息查看軟件 “USBlyzer”

1.3、推薦幾個(gè)關(guān)于USB的基礎(chǔ)知識(shí)的網(wǎng)站

https://www.usbzh.com/article/detail-344.html

http://usb.baiheee.com/

1.4、 USB標(biāo)準(zhǔn)組織官網(wǎng)USB-IF上的資料

關(guān)于USB 2.0資料:

https://www.usb.org/document-library/usb-20-specification

關(guān)于 Printer Device Class 的文檔:

https://www.usb.org/document-library/printer-device-class-document-11

2、修改描述符

首先要通過修改描述符,來枚舉出“打印支持”設(shè)備。

在極海官網(wǎng)下載USB的SDK

https://www.geehy.com/support/apm32?id=305

APM32E10x_EVAL_SDK_v1.0.zip

注釋掉不用的代碼,例如LCD、KEY、LED,這些跟USB無關(guān)。

2.1 描述符的基礎(chǔ)知識(shí)

描述符分為:

設(shè)備描述符 Device Descriptor (g_usbDeviceDescriptor)

配置描述符 Configuration Descriptor (g_usbConfigDescriptor)

端點(diǎn)描述符 Endpoint Descriptor (g_usbConfigDescriptor)

詳細(xì)信息可以看這里:

http://usb.baiheee.com/usb_article/usb_spec/usb_cmd_desc.html

2.2 修改設(shè)備描述符

打開源文件 ....Sourceusbd_descriptor.c ,修改數(shù)組 g_usbDeviceDescriptor[] ,

這里只要把設(shè)備類從CDC 0x02 改為Printer 0x07。

/** bDeviceClass */

0x07, //0x02,

2.3 修改配置描述符和端點(diǎn)描述符

配置描述符和端點(diǎn)描述符都在數(shù)組 g_usbConfigDescriptor[] 中,我們只需要1個(gè)配置,該配置下有2個(gè)端點(diǎn),刪除多余的端點(diǎn),修改成下面這樣。

const uint8_t g_usbConfigDescriptor[USB_CONFIG_DESCRIPTOR_SIZE] =

{

/** bLength */

0x09,

/** bDescriptorType */

USBD_DESC_CONFIGURATION,

/** wTotalLength */

USB_CONFIG_DESCRIPTOR_SIZE & 0xFF, USB_CONFIG_DESCRIPTOR_SIZE >> 8,

/** bNumInterfaces */

0x01,//0x02,

/** bConfigurationValue */

0x01,

/** iConfiguration */

0x00,

/** bmAttributes */

0xC0,

/** MaxPower */

0x32,

/** bLength */

0x09,

/** bDescriptorType */

USBD_DESC_INTERFACE,

/** bInterfaceNumber */

0x00, //0x01,

/** bAlternateSetting */

0x00,

/** bNumEndpoints */

0x02, //0x01,

/** bInterfaceClass */

0x07,//0x02,

/** bInterfaceSubClass */

0x01, //0x02,

/** bInterfaceProtocol */

0x01, //0x01,

/** iInterface */

0x00,

0x07, /** bLength: Endpoint Descriptor size */

USBD_DESC_ENDPOINT, /** bDescriptorType: Endpoint */

0x01, /** bEndpointAddress */

0x02, /** bmAttributes: Bulk */

0x40,0x00, /** wMaxPacketSize: */

0x00, /** bInterval: */

0x07, /** bLength: Endpoint Descriptor size */

USBD_DESC_ENDPOINT, /** bDescriptorType: Endpoint */

0x81, /** bEndpointAddress */

0x02, /** bmAttributes: Bulk */

0x40,0x00, /** wMaxPacketSize: */

0x00 /** bInterval: */

};

2.4 測試是否枚舉成功

修改完描述符后,運(yùn)行程序,拔插USB,設(shè)備管理器中會(huì)出現(xiàn)“打印支持”,使用“USBlyzer”可以看到詳細(xì)的枚舉信息。

a1deb330-354c-11f0-afc8-92fbcf53809c.png

3 實(shí)現(xiàn)類特殊請(qǐng)求

3.1 添加GET_DEVICE_ID請(qǐng)求

DEVICE ID是打印機(jī)類特有的類請(qǐng)求,關(guān)系到打印機(jī)驅(qū)動(dòng)的安裝, 官方文檔“usbprint11a021811.pdf”中有對(duì)這個(gè)的詳細(xì)描述。

a1f44a6a-354c-11f0-afc8-92fbcf53809c.png

通過修改“usbd_class_cdc.c” 文件中的 “void USBD_ClassHandler()”函數(shù)來實(shí)現(xiàn)。

void USBD_ClassHandler(USBD_DevReqData_T* reqData)

{

uint16_t length = ((uint16_t)reqData->byte.wLength[1] << 8) |

reqData->byte.wLength[0] ;

switch (reqData->byte.bRequest)

{

case 0x00: //GET_DEVICE_ID

USBD_CtrlInData(PRINTER_DEVICE_ID, sizeof(PRINTER_DEVICE_ID));

break;

case 0x01: //GET_PORT_STATUS

USBD_CtrlOutData(&g_port_status, 1);

break;

case 0x02: //SOFT_RESET

USBD_CtrlInData(cmdBuf, length);

break;

}

}

3.2 抓包觀察請(qǐng)求是否成功

拔插USB,通過軟件“Bus Hound”可以看到USB主機(jī)發(fā)送了 GET_DEVICE_ID 請(qǐng)求,然后USB設(shè)備也返回了對(duì)應(yīng)的字符串。

a212506e-354c-11f0-afc8-92fbcf53809c.png

4、實(shí)現(xiàn)數(shù)據(jù)的接收

4.1 在OUT端點(diǎn)中保存接收到的數(shù)據(jù)包

在USB OUT端點(diǎn)處理函數(shù)進(jìn)行數(shù)據(jù)的接收操作,在文件 “usbd_class_cdc.c”中的 “void USBD_VCP_OutEpCallback()” 函數(shù)中添加代碼。

void USBD_VCP_OutEpCallback(uint8_t ep)

{

uint32_t dataCnt;

if (ep == USBD_EP_1)

{

dataCnt = g_usbDev.outBuf[USBD_EP_1].xferCnt;

PrinterReceiveCount = dataCnt;

memcpy(PrinterReceiveData,dataBuf,dataCnt); //保存接收到的這包數(shù)據(jù)

USBD_RxData(USBD_EP_1, dataBuf, g_usbDev.outBuf[USBD_EP_1].maxPackSize); //如果想接收下一包,須加這個(gè)

//USBD_TxData(USBD_EP_1, dataBuf, dataCnt);

}

}

4.2 測試數(shù)據(jù)接收功能

為了方便查看接收到的數(shù)據(jù),在while(1)中把接收到的數(shù)據(jù)通過串口發(fā)送出去。

int main(void)

{

APM_EVAL_Init();

printf("This is an example of USB Printer ");

while(1)

{

if(PrinterReceiveCount>0)

{

for(unsigned char i=0;i

{

USART_TxData(DEBUG_USART,PrinterReceiveData[i]);

while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET);

}

PrinterReceiveCount=0;

}

}

}

通過USB發(fā)送數(shù)據(jù)需要一個(gè)上位機(jī),這里使用“條碼打印機(jī)調(diào)試助手”,插上USB后,通訊端口選擇USB,然后打開端口,在數(shù)據(jù)發(fā)送框輸入想發(fā)的數(shù)據(jù),然后點(diǎn)右下角“發(fā)送數(shù)據(jù)”,這時(shí)可以在串口調(diào)試助手上看到MCU剛接收的數(shù)據(jù)。

如下圖所示,每次USB接收到的數(shù)據(jù)都通過串口發(fā)送出來了。

a22c73cc-354c-11f0-afc8-92fbcf53809c.png

注:文章作者在原帖中提供了例程文件,有需要請(qǐng)至原文21ic論壇下載

原文地址:https://bbs.21ic.com/icview-3331288-1-1.html

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8158

    瀏覽量

    271688
  • 打印機(jī)
    +關(guān)注

    關(guān)注

    10

    文章

    797

    瀏覽量

    46949
  • Printer
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    7517
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1074

    瀏覽量

    47953
  • 虛擬串口
    +關(guān)注

    關(guān)注

    3

    文章

    63

    瀏覽量

    14175

原文標(biāo)題:APM32芯得 EP.55 | 基于APM32E103的USB Printer實(shí)現(xiàn)方案

文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于極海APM32E103 MCU的CoreMark測試方法

    CoreMark跑分可以了解到MCU的算力。下面以APM32E103芯片和Keil為例,介紹一下如何在APM32上面運(yùn)行CoraMark測試。CoreMark需要定時(shí)器用于計(jì)時(shí),還需要用串口來打印輸出測試結(jié)果。
    的頭像 發(fā)表于 06-12 09:42 ?390次閱讀
    基于極海<b class='flag-5'>APM32E103</b> MCU的CoreMark測試方法

    stm32f103&gd32的usb虛擬串口,打印類printer組合設(shè)備

    stm32f103&gd32的usb虛擬串口+打印類printer組合設(shè)備@TOCstm32f103&gd32的usb虛擬串
    發(fā)表于 12-02 16:06 ?57次下載
    stm32f<b class='flag-5'>103</b>&gd32的<b class='flag-5'>usb</b>虛擬串口,打印類<b class='flag-5'>printer</b>組合設(shè)備

    極海半導(dǎo)體APM32E103/F072系列MCU順利通過IEC 60730功能安全認(rèn)證

    近日,極海半導(dǎo)體APM32E103/APM32F072系列MCU,順利通過IEC 60730功能安全認(rèn)證,并提供符合B類標(biāo)準(zhǔn)的軟件安全庫,有效保證了面向家用電器領(lǐng)域的嵌入式控制設(shè)備的軟硬件安全運(yùn)行,同時(shí)降低了終端產(chǎn)品在認(rèn)證過程中投入的時(shí)間與成本。
    發(fā)表于 09-29 14:17 ?1437次閱讀

    APM32E103xCxE用戶手冊(cè)

    APM32E103xCxE用戶手冊(cè)
    發(fā)表于 11-09 21:03 ?6次下載
    <b class='flag-5'>APM32E103</b>xCxE用戶手冊(cè)

    APM32E103xCxE數(shù)據(jù)手冊(cè)

    APM32E103xCxE數(shù)據(jù)手冊(cè)
    發(fā)表于 11-09 21:03 ?2次下載
    <b class='flag-5'>APM32E103</b>xCxE數(shù)據(jù)手冊(cè)

    APM32E103VET6S數(shù)據(jù)手冊(cè)

    APM32E103VET6S數(shù)據(jù)手冊(cè)
    發(fā)表于 11-09 21:03 ?13次下載
    <b class='flag-5'>APM32E103</b>VET6S數(shù)據(jù)手冊(cè)

    APM32E103VCS MINI開發(fā)板原理圖

    APM32E103VCS MINI開發(fā)板原理圖
    發(fā)表于 11-09 21:03 ?2次下載
    <b class='flag-5'>APM32E103</b>VCS MINI開發(fā)板原理圖

    APM32E103VET6_LSE_RTC不走時(shí)

    APM32E103VET6_LSE_RTC不走時(shí)
    發(fā)表于 11-09 21:03 ?2次下載
    <b class='flag-5'>APM32E103</b>VET6_LSE_RTC不走時(shí)

    APM32E103RET6_電源_概率性出現(xiàn)電流噪音

    APM32E103RET6_電源_概率性出現(xiàn)電流噪音
    發(fā)表于 11-09 21:03 ?0次下載
    <b class='flag-5'>APM32E103</b>RET6_電源_概率性出現(xiàn)電流噪音

    APM32E103VET6S_SDRAM模塊_SDRAM與IO口沖突問題

    APM32E103VET6S_SDRAM模塊_SDRAM與IO口沖突問題
    發(fā)表于 11-09 21:03 ?1次下載
    <b class='flag-5'>APM32E103</b>VET6S_SDRAM模塊_SDRAM與IO口沖突問題

    APM32F103VCT6S_USB_MAC電腦無法識(shí)別USB設(shè)備

    APM32F103VCT6S_USB_MAC電腦無法識(shí)別USB設(shè)備
    發(fā)表于 11-09 21:04 ?0次下載
    <b class='flag-5'>APM32F103VCT6S_USB</b>_MAC電腦無法識(shí)別<b class='flag-5'>USB</b>設(shè)備

    APM32E103RET6_輸出端口需求_要求OCx通道輸出高電平

    APM32E103RET6_輸出端口需求_要求OCx通道輸出高電平
    發(fā)表于 11-09 21:04 ?0次下載
    <b class='flag-5'>APM32E103</b>RET6_輸出端口需求_要求OCx通道輸出高電平

    APM32E103VET6_SMC_SMC驅(qū)動(dòng)8080并口屏?xí)r屏幕無法點(diǎn)亮

    APM32E103VET6_SMC_SMC驅(qū)動(dòng)8080并口屏?xí)r屏幕無法點(diǎn)亮
    發(fā)表于 11-09 21:04 ?2次下載
    <b class='flag-5'>APM32E103</b>VET6_SMC_SMC驅(qū)動(dòng)8080并口屏?xí)r屏幕無法點(diǎn)亮

    APM32E103VET6_硬件問題_低功耗電流偏高

    APM32E103VET6_硬件問題_低功耗電流偏高
    發(fā)表于 11-09 21:04 ?1次下載
    <b class='flag-5'>APM32E103</b>VET6_硬件問題_低功耗電流偏高

    APM32E103ZE EVAL 原理圖

    APM32E103ZE EVAL 原理圖
    發(fā)表于 11-09 21:04 ?0次下載
    <b class='flag-5'>APM32E103</b>ZE EVAL 原理圖