|
السلام عليكم ورحمة الله وبركاتة
اولا اعتزر عن التاخير فقد كنت مصابا بالبرد الشديد (نزلة برد)لا اراكم الله سوء
ونحمد الله على كل شىء .
=====================
طبعا استفدت كثيرا من شروحاتك السابقة
والان بحمد الله استطيع التعامل مع الميمورى كارت
ولكن لاحظت ان القرائة تتم بايت بايت او حرف حرف ascii
بمعنى لو كتبنا 25 يثم قرائتة 2 ثم 5 ولا يقراء 25 كبايت واحد
للتوضيح اكثر
لو مسجل فى الملف 0xFF فالبرنامج يقرئها هكذا
0
ثم x
ثم F
ثم F
واعتقد ان افضل حل هو الحفظ بنظام ascii فقط
=============
مااسعى الية حاليا هو قرائة ملفات الفيديو
واى جديد سوف يتم وضعة هنا باذن الله
وكل عام وانتم بخير
ورمضــــــــــــــــــــــــــــــــــان كريـــــــــــــــــــــــــــــــــم
|
السلام عليكم
حمدلله على سلامه وان شالله ماشوف شر
أخي الكريم انا أيضا أبحث عن كيفيه قراءه ملف صوتي او فيديو
ولكني وجدته الكودالخاص بــ MP3 هو يبين كيف يتم قراءه
هو يحث يقوم بتقسيمه الى 448 بايت ولكن لاعلم لي بهذا الرقم هل هو block كامل ام لا
كود:
if (Mmc_Fat_Init() == 0) {
if (Mmc_Fat_Assign("sound.mp3", 0) ) {
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1,2,"File Assigned");
Delay_ms(1500);
Mmc_Fat_Reset(&file_size); // Call Reset before file reading,
// procedure returns size of the file
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1,1,"Playing audio :)");
// send file blocks to MP3 SDI
while (file_size > BUFFER_SIZE)
{
// Set the SPI faster when reading data from mikro SD memory
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
for (i=0; i<BUFFER_SIZE; i++)
{
Mmc_Fat_Read(mp3_buffer + i);
}
file_size -= BUFFER_SIZE;
}
// send the rest of the file to MP3 SDI
// Set the SPI faster when reading data from mikro SD memory
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
for (i=0; i<file_size; i++)
{
Mmc_Fat_Read(mp3_buffer + i);
}
// Set the SPI slower when sending data to mp3 codec
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV16, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
for (i=0; i<file_size; i++)
{
MP3_SDI_Write(mp3_buffer[i]);
}
واذا لقينا كود MP3 يعني نجعله عام يصبح هكذا
كود:
if (Mmc_Fat_Init() == 0) {
if (Mmc_Fat_Assign("sound.mp3", 0) ) {
Mmc_Fat_Reset(&file_size); // Call Reset before file reading,
// send file blocks to MP3 SDI
while (file_size > BUFFER_SIZE)
{
// Set the SPI faster when reading data from mikro SD memory
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
for (i=0; i<BUFFER_SIZE; i++)
{
Mmc_Fat_Read(mp3_buffer + i);
}
file_size -= BUFFER_SIZE;
}
// send the rest of the file to MP3 SDI
// Set the SPI faster when reading data from mikro SD memory
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
for (i=0; i<file_size; i++)
{
Mmc_Fat_Read(mp3_buffer + i);
}
يعني بأختصار أخي انك راح تؤشر على ملف عن طريق هذا الامر
كود:
Mmc_Fat_Assign("sound.mp3", 0)
بعد ذلك يتم أحتساب حجم ملف بالبايت
كود:
Mmc_Fat_Reset(&file_size);
وبعدها لايمكننا عمل مصفوفه بقدر حجم ملف لانه كما تعرف لاتسمح حجم ميموري بذلك وعليه قسمت الى 448 بايت
حيث ذكرو بالكود في بدايه البرنامج
كود:
const BUFFER_SIZE = 448;
char mp3_buffer[BUFFER_SIZE];
وعليه هنا يقول اذا كان حجم ملف الذي تمت قراءته أكبر من 448 أذن أخذ اول 448 ونفذ كود التالي
كود:
while (file_size > BUFFER_SIZE)
{
// Set the SPI faster when reading data from mikro SD memory
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
for (i=0; i<BUFFER_SIZE; i++)
{
Mmc_Fat_Read(mp3_buffer + i);
}
file_size -= BUFFER_SIZE;
}
حيث يتم قراءه ملف وخزنها في مصفوفه mp3_buffer وانت في هذه حاله عندما تقرأها عليك بارسال هذه البيانات الى led_matrix مثلا او اي خرج اخر
بعد ذلك راح يطرح حجم ملف من 448 (BUFFER_SIZE=448) ويشوف هل لايزال حجم ملف اكبر من 448 اذا كان نعم أعد عمليه بقراءه 448 بايت الثانيه
اما اذا كان لا مثلا بقت 300 بايت هذه لابد من قراءتها اذن الكود التالي سيتكفل بقراءه الباقي
كود:
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
for (i=0; i<file_size; i++)
{
Mmc_Fat_Read(mp3_buffer + i);
}
ونفس الشيئ كلما تنتهي من قراءه ترسل البيانات الى خرج
أذن أخي هذا افضل الكود رأيته انا ولكن انا أيضا لازالت هذه نقطه غير واضحه مثلا لماذا أختار 448 بايت وهل أستطيع أختيار اكبر من ذلك او أقل من ذلك
أساسا كنت أبحث في اانترنيت عن عمليه قراءه ملف فيديو او صوت هو 100% يتم تجزئه ملف كما أشرت اليك ولكن كيف يتحول مقطع الصوتي الى داتا
على فكره الامر
كود:
Mmc_Fat_Reset(&file_size);
يرجع حجم ملف بالبايت كما أشرت لك ويخزنها في file_size علما ان file_size هو من نوع
كود:
unsigned long file_size;
اي أن أقصى حجم ملف ممكن قراءته هو 4294967295 بايت هو كبير بما يكفي
=============================================
طبعا أخي يوجد كود هو لمعرفه هل ميموري تمت أدخالها ام لا
طبعا هذا الكود خاص بـــMP3
كود:
Mmc_Card_Detect_Direction = 1; // Set card detection pin to be input
Lcd_Cmd(_LCD_CLEAR); // Prepare and output static text on LCD
Lcd_Out(1,2,"Insert SD card");
Delay_ms(1500);
while(Mmc_Card_Detect); // Loop until card is detected
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1,1,"SD Card inserted"); // SD Card present report
Delay_ms(1500);