1、對于單發(fā)送或者接收的端點(diǎn),端點(diǎn)數據長(cháng)度為32字節,是否可配置DMA緩存長(cháng)度為32字節;
2、手冊上有這樣一句話(huà):
“注:接收數據的緩沖區的長(cháng)度 >= min(可能接收到的最大數據包長(cháng)度 + 2 字節,64 字節)”
這個(gè)“2字節”是個(gè)什么意思?
1、對于單發(fā)送或者接收的端點(diǎn),端點(diǎn)數據長(cháng)度為32字節,是否可配置DMA緩存長(cháng)度為32字節;
2、手冊上有這樣一句話(huà):
“注:接收數據的緩沖區的長(cháng)度 >= min(可能接收到的最大數據包長(cháng)度 + 2 字節,64 字節)”
這個(gè)“2字節”是個(gè)什么意思?
1、需要指定端點(diǎn)描述符大小為32+2字節。
2、在USB數據包中的有效數據后會(huì )有2字節的CRC。當DATA包的數據段不滿(mǎn)64字節時(shí),2字節的CRC也會(huì )被DMA搬運至RAM中,需要在定義緩沖區的時(shí)候進(jìn)行占位。
就是說(shuō)多出來(lái)的2字節在分配dma空間時(shí)還是必須分配,但是軟件的其他地方是否可以使用這2字節的空間呢?還是讓他空著(zhù)不管?
你好,順便再問(wèn)個(gè)問(wèn)題,請問(wèn)ch55x系列單片機中所有的中斷優(yōu)先級可不可以設置成同級別的,也就說(shuō)讓某幾個(gè)中斷不嵌套。我看了下手冊感覺(jué)中斷默認都是嵌套的。謝謝!
如果是傳輸長(cháng)度不滿(mǎn)64字節,緩沖區需要2字節占位的情況下,這兩個(gè)字節隨時(shí)可能被USB外設修改(當發(fā)生了USB傳輸的時(shí)候)。
如果不想產(chǎn)生嵌套,IP寄存器全部設為0即可。
注:接收數據的緩沖區的長(cháng)度 >= min(可能接收到的最大數據包長(cháng)度 + 2字節,64字節)?
還是這個(gè)問(wèn)題,如果設備描述符的端點(diǎn)0最大包設置為64字節=0x40,最大可能收到的數據包為64字節,
這里min(64+2,64)=64,緩沖區長(cháng)度要設置為64?可能多出來(lái)的兩個(gè)字節CRC放哪里呢?
看了很多Demo,端點(diǎn)0最大包都設置為8字節,是否可以設置為64字節呢?
或者是否可以這樣理解:最大緩沖區長(cháng)度可以設置64字節,可接收的最大數據包長(cháng)度為64-2=62字節?
1、USB傳輸較長(cháng)包時(shí),有效數據加上2字節CRC超過(guò)64字節長(cháng)度的,超出64的部分不會(huì )被DMA搬運到RAM中。
所以緩沖區長(cháng)度定義成64,就可以保證任意長(cháng)度的數據傳輸可靠。
當USB傳輸全部是短包的時(shí)候,從節約ram使用的角度考慮,可以準確的定義緩沖區長(cháng)度為 最大包長(cháng)度+2。
舉例:當設計端點(diǎn)0的最大長(cháng)度為8字節(端點(diǎn)0能力是64字節,根據需要可以改)的時(shí)候,緩沖區長(cháng)度需要配置成8+2=10字節
????????端點(diǎn)1根據通訊雙方約定的最大包長(cháng)度是32字節的時(shí)候,長(cháng)度32+2=34字節
????????端點(diǎn)1根據通訊雙方約定的最大包長(cháng)度是63字節的時(shí)候,63+2=65,65大于最大長(cháng)度64,長(cháng)度寫(xiě)成64字節
????????端點(diǎn)1根據通訊雙方約定的最大包長(cháng)度是64字節的時(shí)候,長(cháng)度直接等于64字節
2、端點(diǎn)長(cháng)度問(wèn)題
端點(diǎn)0可以配置成64字節的長(cháng)度,緩沖區定義長(cháng)度問(wèn)題同其余端點(diǎn)一致
感謝解釋?zhuān)@下就非常清楚了。
一句話(huà)總結就是:USB的DMA在搬運數據時(shí),會(huì )多搬運2個(gè)字節的CRC,但是搬運總數據最大不超過(guò)64字節。
ps.
兩個(gè)字節的CRC對用戶(hù)來(lái)說(shuō)是沒(méi)有用的,感覺(jué)這個(gè)像是USB IP的的一個(gè)known issue.