STM32F7 14 Quad-SPI interface (QUADSPI)

Started by tha, November 22, 2022, 02:04:44 PM

Previous topic - Next topic

tha

The Flash memory size, ตามที่ระบุใน FSIZE[4:0] (QUADSPI_DCR[20:16]), ควรสะท้อนถึง the total Flash memory capacity, ซึ่งเป็นสองเท่าขนาดของ one individual component.

ถ้า address X เป็นเลขคู่, ดังนั้น the byte ซึ่ง the QUADSPI ให้สำหรับ address X คือ the byte ที่ the address X/2 ของ FLASH 1, และ the byte ซึ่ง the QUADSPI ให้สำหรับ address X+1 คือ the byte ที่ the address X/2 ของ FLASH 2. กล่าวคือ, bytes ที่ even addresses ทั้งหมดถูกเก็บใน FLASH 1 และ bytes ที่ odd addresses ทั้งหมดถูกเก็บใน FLASH 2.

tha

เมื่ออ่าน the Flash memories status registers ใน dual-flash mode, จะมีจำนวนไบต์เป็นสองเท่าถูกอ่านเมื่อเปรียบเทียบกับการอ่านแบบเดียวกันใน single-flash mode. นี้หมายความว่าถ้าแต่ละ Flash memory ให้ 8 valid bits หลังจาก the instruction สำหรับการดึง the status register, ดังนั้น the QUADSPI ต้องถูกกำหนดค่าด้วย a data length of 2 bytes (16 bits), และ the QUADSPI จะรับ one byte จากแต่ละ Flash memory. ถ้าแต่ละ Flash memory ให้ a status of 16 bits, ดังนั้น the QUADSPI ต้องถูกกำหนดค่าเพื่ออ่าน 4 bytes เพื่อให้ได้ทุก the status bits ของทั้งสอง Flash memories ใน dual-flash mode.

tha

จำนวนเลขคู่ของ bytes ต้องถูกเข้าถึงเสมอใน dual-flash mode. ด้วยเหตุผลนี้, bit 0 ของ the data length field (QUADSPI_DLR[0]) จะติดอยู่ที่ 1 เมื่อ DRM = 1.

ใน dual-flash mode, ลักษณะการทำงานของ FLASH 1 interface signals โดยพื้นฐานแล้วจะเหมือนกับใน normal mode. FLASH 2 interface signals มีรูปคลื่นเหมือนกับ  FLASH 1 ทุกประการในระหว่าง the instruction, address, alternate-byte, and dummy-cycles phases. กล่าวอีกนัยหนึ่ง, แต่ละ Flash memory รับ the same instruction and the same address เสมอ. จากนั้น, ในระหว่าง the data phase, the BK1_IOx and BK2_IOx buses ทั้งคู่จะส่งถ่าย data ขนานกัน, แต่ the data ที่ถูกส่งไปยัง (หรือถูกรับจาก) FLASH 1 จะแตกต่างจากเหล่านั้นของ FLASH 2.


tha

14.3.5 QUADSPI indirect mode

เมื่ออยู่ใน indirect mode, commands ถูกสตาร์ทโดยการเขียนไปยัง QUADSPI registers และ data ถูกส่งถ่ายโดยการเขียนหรือการอ่าน the data register, ในลักษณะเดียวกับสำหรับ communication peripherals อื่นๆ.

เมื่อ FMODE = 00 (QUADSPI_CCR[27:26]), the QUADSPI จะอยู่ใน indirect write mode, โดยที่ bytes จะถูกส่งไปยัง the Flash memory ในระหว่าง the data phase. Data ถูกจัดให้มีโดยการเขียนไปยัง the data register (QUADSPI_DR).

เมื่อ FMODE = 01, the QUADSPI จะอยู่ใน indirect read mode, โดยที่ bytes จะถูกรับจาก the Flash memory ในระหว่าง the data phase. Data จะถูกกู้โดยการอ่าน QUADSPI_DR.

จำนวนของ bytes ที่จะถูกอ่าน/เขียนถูกระบุใน the data length register (QUADSPI_DLR). ถ้า QUADSPI_DLR = 0xFFFF_FFFF (ทั้งหมดเป็น 1's), ดังนั้น the data length จะถูกพิจารณาว่าไม่ได้กำหนดและ the QUADSPI จะต่อเนื่องส่งถ่าย data ไปจนกว่า the end of Flash memory (ตามที่กำหนดโดย FSIZE) ถูกถึง. ถ้าไม่มี bytes ที่จะถูกส่งถ่าย, DMODE (QUADSPI_CCR[25:24]) ควรถูกเซ็ตเป็น 00.

ถ้า QUADSPI_DLR = 0xFFFF_FFFF and FSIZE = 0x1F (ค่าสูงสุดที่ระบุ a 4GB Flash memory), ดังนั้นในกรณีพิเศษนี้ the transfers จะต่อเนื่องไปอย่างไม่จำกัด, จะหยุดเฉพาะหลังจาก an abort request หรือหลังจาก the QUADSPI ถูกปิดใช้งาน. หลังจาก the last memory address ถูกอ่าน (ที่ address 0xFFFF_FFFF), การอ่านจะต่อเนื่องด้วย address = 0x0000_0000.

เมื่อจำนวนที่โปรแกรมของ bytes ที่จะถูกส่งหรือรับถูกถึง, TCF จะถูกเซ็ตและ an interrupt จะถูกสร้างถ้า TCIE = 1. ในกรณีที่ไม่ได้กำหนดจำนวนของ data, the TCF จะถูกเซ็ตเมื่อขีดจำกัดของ the external SPI memory ถูกถึงตาม the Flash memory size ที่กำหนดใน the QUADSPI_CR.

tha

Triggering the start of a command

โดยพื้นฐานแล้ว, a command จะสตาร์ททันทีที่ firmware ให้ the last information ที่จำเป็นสำหรับ command นี้. ขึ้นอยู่กับ the QUADSPI configuration, มีสามวิธีที่แตกต่างกันในการทริก the start of a command ใน indirect mode. The commands จะสตาร์ททันทีหลังจาก:
1.   การเขียนถูกดำเนินการไปยัง INSTRUCTION[7:0] (QUADSPI_CCR), ถ้า address ไม่มีความจำเป็น (เมื่อ ADMODE = 00) และ
      ถ้าไม่มี data จำเป็นต้องถูกจัดให้มีโดย the firmware (เมื่อ FMODE = 01 or DMODE = 00)
2.   การเขียนถูกดำเนินการไปยัง ADDRESS[31:0] (QUADSPI_AR), ถ้า an address มีความจำเป็น (เมื่อ ADMODE != 00) และถ้า
      ไม่มี data จำเป็นต้องถูกจัดให้มีโดย the firmware (เมื่อ FMODE = 01 or DMODE = 00)
3.   การเขียนถูกดำเนินการไปยัง DATA[31:0] (QUADSPI_DR), ถ้า an address มีความจำเป็น  (เมื่อ ADMODE != 00) และถ้า
      data จำเป็นต้องถูกจัดให้มีโดย the firmware (เมื่อ FMODE = 00 and DMODE != 00)

การเขียนไปยัง the alternate byte register (QUADSPI_ABR) จะไม่ทริก the communication start. ถ้า bytes สำรองถูกต้องการ, พวกมันต้องถูกโปรแกรมไว้ก่อน.

ทันทีที่ a command ถูกสตาร์ท, the BUSY bit (bit 5 of QUADSPI_SR) จะถูกเซ็ตโดยอัตโนมัติ.

tha

FIFO and data management

ใน indirect mode, data จะผ่าน a 32-byte FIFO ซึ่งอยู่ภายใน the QUADSPI. FLEVEL[5:0] (QUADSPI_SR[13:8]) แสดงให้เห็น bytes จำนวนเท่าไหร่ที่ตอนนี้กำลังถูกถือไว้ใน the FIFO.

ใน indirect write mode (FMODE = 00), firmware เพิ่ม data ไปยัง the FIFO เมื่อมันเขียน QUADSPI_DR. Word writes เพิ่ม 4 bytes ไปยัง the FIFO, halfword writes เพิ่ม 2 bytes, และ byte writes เพิ่มเฉพาะ 1 byte. ถ้า firmware เพิ่ม bytes มากเกินไปไปยัง the FIFO (มากกว่าที่แสดงให้เห็นโดย DL[31:0]), the bytes ที่เกินจะถูกล้างจาก the FIFO ที่ the end of the write operation (เมื่อ TCF ถูกเซ็ต).

Byte/halfword เข้าถึงไปยัง QUADSPI_DR ต้องถูกทำเฉพาะกับ the least significant byte/halfword ของ the 32-bit register.

FTHRES[3:0] ถูกใช้เพื่อกำหนด a FIFO threshold. เมื่อขอบเขตถูกถึง, the FTF (FIFO threshold flag) จะถูกเซ็ต. ใน indirect read mode, FTF จะถูกเซ็ตเมื่อจำนวนของ valid bytes ที่จะถูกอ่านจาก the FIFO อยู่เหนือขอบเขต. FTF จะถูกเซ็ตด้วยถ้ามี data ใน the FIFO หลังจาก the last byte ถูกอ่านจากthe Flash memory, โดยไม่คำนึงถึง the FTHRES setting. ใน indirect write mode, FTF จะถูกเซ็ตเมื่อจำนวนของ empty bytes ใน the FIFO อยุ่เหนือขอบเขต.

tha

ถ้า FTIE = 1, จะมี an interrupt เมื่อ FTF ถูกเซ็ต. ถ้า DMAEN = 1, a DMA transfer จะถูกเริ่มต้นเมื่อ FTF ถูกเซ็ต. FTF จะถูกเคลียร์โดย HW ทันทีที่ the threshold ไม่เป็นจริงอีกต่อไป (หลังจาก enough data ถูกส่งถ่ายแล้วโดย the CPU or DMA).

ใน indirect read mode, เมื่อ the FIFO กลายมาเป็นเต็ม, the QUADSPI จะหยุดชั่วคราวการอ่าน bytes จาก the Flash memory เพื่อหลีกเลี่ยง an overrun. บันทึกไว้ว่าการอ่านของ the Flash memory จะไม่รีสตาร์ทจนกว่า 4 bytes จะว่างใน the FIFO (เมื่อ FLEVEL ≤ 28). ดังนั้น เมื่อ FTHRES ≥ 29 แอปพลิเคชันจะต้องดูแลเพื่ออ่านจำนวนไบต์ให้เพียงพอเพื่อให้แน่ใจว่า the QUADSPI จะสตาร์ทการดึง data จาก the Flash memory อีกครั้ง. มิฉะนั้น, the FTF flag จะอยู่ที่ '0' ตราบใดที่ 28 < FLEVEL < FTHRES.

tha

14.3.6 QUADSPI status flag polling mode

ใน automatic-polling mode, the QUADSPI จะสตาร์ท a command เป็นระยะเพื่ออ่านจำนวนที่กำหนดไว้ของ status bytes (มากถึง 4). The received bytes สามารถถูกบังเพื่อแยกบาง status bits และ an interrupt สามารถถูกสร้างเมื่อบิตที่เลือกมีค่าที่กำหนด.

การเข้าถึงไปยัง the Flash memory จะเริ่มในลักษณะเดียวกับใน indirect read mode: ถ้าไม่มี address ถูกต้องการ (AMODE = 00), การเข้าถึงจะเริ่มทันทีที่ the QUADSPI_CCR ถูกเขียน. มิฉะนั้น, ถ้า an address ถูกต้องการ, the first access จะเริ่มเมื่อ QUADSPI_AR ถูกเขียน. BUSY ไปเป็น high ณ จุดนี้และคงอยู่ high แม้ระหว่างการเข้าถึงเป็นระยะๆ.

สิ่งที่บรรจุอยู่ภายในของ MASK[31:0] (QUADSPI_PSMAR) ถูกใช้เพื่อบัง the data จาก the Flash memory ใน automatic-polling mode. ถ้า the MASK[n] = 0, ดังนั้น bit n ของ the result จะถูกบังและไม่ถูกพิจารณา. ถ้า MASK[n] = 1, และสิ่งที่บรรจุอยู่ภายในของ bit[n] เป็นอย่างเดียวกันกับ MATCH[n] (QUADSPI_PSMAR), ดังนั้นมีคู่ที่เหมือนกันสำหรับ bit n.

ถ้า the polling match mode bit (PMM, bit 23 of QUADSPI_CR) เป็น 0, ดังนั้น "AND" match mode ถูกทำให้ทำงาน. นี้หมายความว่า status match flag (SMF) จะถูกเซ็ตเฉพาะเมื่อมีคู่ที่เหมือนกันบนทั้งหมดของ the unmasked bits.

ถ้า PMM = 1, ดังนั้น "OR" match mode ถูกทำให้ทำงาน. นี้หมายความว่า SMF จะถูกเซ็ตถ้ามีคู่ที่เหมือนกันบนบิตใดๆของ the unmasked bits.

An interrupt จะถูกเรียกเมื่อ SMF ถูกเซ็ตถ้า SMIE = 1.

ถ้า the automatic-polling-mode-stop (APMS) bit ถูกเซ็ต, การทำงานจะหยุดลงและ BUSY จะกลายเป็น 0 ทันทีที่มีคู่ที่เหมือนกันถูกตรวจพบ. มิฉะนั้น, BUSY จะอยู่ที่ '1' และการเข้าถึงเป็นระยะดำเนินการต่อไปจนกว่าจะมีการยกเลิกหรือ the QUADSPI ถูกปิดใช้งาน (EN = 0).

The data register (QUADSPI_DR) บรรจุ the latest received status bytes (the FIFO ถูกทำให้ไม่ทำงาน). สิ่งที่บรรจุอยู่ภายในของ the data register ไม่ได้รับผลกระทบโดยการบังที่ใช้ใน the matching logic. The FTF status bit จะถูกเซ็ตทันทีที่ a new reading ของ the status เสร็จสิ้น, และ FTF จะถูกเคลียร์ทันทีที่ the data ถูกอ่าน.