SD card using SPI in STM32

Started by tha, June 02, 2022, 03:34:20 PM

Previous topic - Next topic

tha

https://controllerstech.com/sd-card-using-spi-in-stm32/
ต้องขอขอบคุณทางทีมงานเว็บไซส์นี้ ที่ให้ความรู้เรามาไว้ ณ ที่นี้ด้วยครับ

SD card using SPI in STM32

คุณรู้อยู่แล้วว่าคุณกำลังมองหาอะไรและนั่นคือเหตุผลที่คุณมาที่นี่ ดังนั้น ฉันจะไม่เสียเวลากับข้อเท็จจริงที่ว่าการ์ด SD คืออะไร มันทำงานอย่างไรและทั้งหมดนี้..

ในบทช่วยสอนนี้ เราจะเชื่อมต่อการ์ด SD กับไมโครคอนโทรลเลอร์ stm32 โดยใช้โหมด SPI ฉันใช้คอนโทรลเลอร์ STM32F103C8 และขนาดการ์ด SD คือ 1 GB นอกจากนี้ เราจะดำเนินการจัดการไฟล์ขั้นพื้นฐาน เช่น การสร้างไฟล์ การเขียน การอ่าน การลบ ฯลฯ

การดำเนินการขั้นสูงบางอย่าง เช่น การดำเนินการเกี่ยวกับไดเร็กทอรีจะกล่าวถึงในบทช่วยสอนอื่น ดังนั้น มาเริ่มกันเลยดีกว่า

Reference: https://m.blog.naver.com/PostView.nhn?blogId=eziya76&logNo=221188701172&proxyReferer=https%3A%2F%2Fgithub.com%2Feziya%2FSTM32_SPI_SDCARD

tha

                                       UPDATE 1

The code ถูกอัฟเดตด้วย new libraries ขอขอบคุณไปยัง eziya
https://blog.naver.com/eziya76/221188701172 SPI สามารถทำงานสูงถึง 10 Mbps

ถ้าได้รับ FR_NOT_READY error, ใช้ external 5V power source. Power จาก board ดูเหมือนจะไม่พียงพอ (อาจเป็นกระแสที่ต้องการสำหรับ the module)

เพื่อทราบ errors เหล่านี้, ใส่ a Breakpoint หลังจาก f_mount และดูค่าของ fresult.

tha

                                      UPDATE 2

ถ้าคุณได้รับ FR_NO_FILESYSTEM (หลักๆจะเกิดขึ้นกับ LOW storage cards), จากนั้นใช้ the older library จาก https://controllerstech.com/wp-content/uploads/2020/07/SDCARD_SPI_OLD_F103.zip

เพื่อทราบ errors เหล่านี้, ใส่ a Breakpoint หลังจาก f_mount และดูค่าของ fresult.


tha

                                        HOW TO

ขั้นแรกอย่างชัดเจนเราจำเป็นต้องสร้าง a project ใน CubeMx และให้แน่ใจว่าคุณทำตามขั้นตอนด้านล่าง.



ตรวจสอบให้แน่ใจว่าคุณเลือก fatfs และฉันได้ปล่อยให้ทุกอย่างเป็นค่าเริ่มต้น ฉันยังเลือก uart ใน project ของฉันเพื่อให้ the data สามารถถูกส่งไปยังคอมพิวเตอร์ได้



นอกจากนี้ the SPI speed จะถูกเก็บไว้ที่ 2.25 MBits/s. นี่เป็นสิ่งสำคัญ ตรวจสอบให้แน่ใจว่าคุณรักษาความเร็วของคุณไว้ประมาณนี้.

ปล. ในโปรเจ็คที่เขาใช้ STM32F103 เขาตั้ง the SPI speed ไว้ที่ 9 MBits/s (Prescaler = 8 ) ลองดู

tha

หลังจาก the project ถูกสร้าง, เปิดมันและตอนนี้เราจำเป็นต้องก๊อปปี้บาง library files ลงใน the project folder.

ก๊อปปี้ the files fatfs_sd.c and fatfs_sd.h ลงใน the src and inc folders ตามลำดับ. หลังจากการก๊อปปี้เรีบบร้อยแล้ว, เราจำเป็นต้องกำหนดพื้นฐานบางอย่างและทั้งหมด.

ขั้นแรก, เปิด the fatfs_sd.c file และแก้ไขตามนี้


tha

ต่อไป ในไฟล์ user_diskio.c เราต้องทำการเปลี่ยนแปลงบางอย่าง และคุณจะเห็นการเปลี่ยนแปลงนั้น เมื่อคุณดาวน์โหลดโค้ด

เราจำเป็นต้องตั้งค่า the Timer 1 and Timer 2 functions ด้วย.  ค่าเหล่านี้ควรลดลงอย่างคงที่ทุกๆ 1 ms และนั่นเป็นสาเหตุที่เรากำหนดพวกมันไว้ภายใน the interrupt handler, ใน the systick handler.

ดังนั้น เปิด STM32f1xx_it.c และกำหนดตามนี้:


tha

                                    Some Insight into the CODE

f_mount จะตั้ง the SD card. "/" คือ the path, ที่เราต้องการที่จะตั้ง. fs คือ the pointer ไปยัง the file system, ซึ่งเราจำเป็นต้องกำหนดเป็น a global definition, เนื่องจากเราจะใช้งานมันบ่อยมาก.



เมื่อ the card ถูกตั้ง, เราจะสร้าง a file และเพื่อทำสิ่งนั้น, เราจะใช้ฟังชั่นต่อไปนี้



หากไฟล์มีอยู่แล้ว การดำเนินการนี้จะทับมัน และหากไม่มีไฟล์อยู่ ระบบจะสร้างไฟล์ใหม่และจากนั้นเปิดไฟล์ขึ้นมา

fil คือ the pointer ไปยัง the file, ซึ่งเป็นแบบ global ด้วย.
"file2.txt" คือ the name ของ the file, ที่เราต้องการที่จะสร้าง
the third parameter คือ the attributes ที่ให้กับ the file. ข้างล่างคือตารางสำหรับนั้น


tha

เมื่อ the file ถูกเปิด, เราสามารถเขียน the data โดยใช้ the function ข้างล่าง



ไม่มี bw คือ the variable เพื่อเก็บ the count of the number of bytes ที่เขียนไปยัง the file.
buffer บรรจุ the string, ที่เราต้องการเขียนลงใน the file.