Тепер нам потрібно буде наборот НЕ дригати ніжками, а відстежувати їх стан. Насамперед створимо позитивний фронт, виставивши високий рівень на ніжці SCK
PORTB | = (1<
Зрушуємо result вліво на 1 пункт, щоб підготувати місце для нового біта. Якщо це буде найперший цикл, то нічого страшного, у нас дана змінна все одно в нулі, тому не будемо складати якихось умов
PORTB | = (1<
result <<=1; //сдвигаем влево байт, чтобы записать очередной бит
Тепер, у разі якщо у нас рівень на ніжці MISO дорівнює 1, то Запша її в правий біт змінної ewsult
result <<=1; //сдвигаем влево байт, чтобы записать очередной бит
if ((PINB (1<
result = result | 0x01; // запишемо лічений з лапки порту MISO біт
Потім негативний фронт на SCK і чекаємо 1 такт
result = result | 0x01; // запишемо лічений з лапки порту MISO біт
(1<
asm ( "nop"); // 1 такт почекаємо
Завершимо цикл і повернемо результат з функції
asm ( "nop"); // 1 такт почекаємо
return result; // повернемо результат
Тепер нам потрібно написати функцію передачі команд в SD.
Відкриємо приклад в даташіте

У кожної команди є індекс. У даній команди індекс 8, так як вона іменується CMD8. Також існують відмінності в типах команд. Але про це потім, нас поки цікавить саме такий тип, причому саме цю команду нам потім також доведеться передавати.
Ми бачимо що передача команди складається з 48 біт, тобто з 6 байтів. Перший рядок показує позицію біта в команді, друга - величину параметра в бітах, третя - значення, а четверта - роз'яснення параметра.
Стартовий біт - завжди 0.
Біт передачі - 1.
індекс команди - в разі даної команди дорівнює 8.
потім йдуть зарезервовані біти - цілих 20 штук, всі рівні нулю.
Потім йдуть параметри, 7 біт контрольної суми і стоповий біт - завжди 1.
Тому нам потрібно буде написати функцію передачі команди
Напишемо її після наших функцій передачі і прийому байтів, так як нова функція цими функціями буде користуватися
unsigned char SD_cmd (char dt0. char dt1. char dt2. char dt3. char dt4. char dt5)
Ось скільки параметрів. Прямо як у нас байтів в команді. Потім ми про них дізнаємося більше
unsigned char SD_cmd (char dt0. char dt1. char dt2. char dt3. char dt4. char dt5)