|
@@ -1,49 +1,32 @@
|
|
|
-/*
|
|
|
- * ####################################################################################### Connect AVR to MMC/SD Copyright (C) 2004
|
|
|
- * Ulrich Radig Bei Fragen und Verbesserungen wendet euch per EMail an mail@ulrichradig.de oder im Forum meiner Web Page :
|
|
|
- * www.ulrichradig.de Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von
|
|
|
- * der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder (nach Ihrer
|
|
|
- * Option) jeder späteren Version. Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird,
|
|
|
- * aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.
|
|
|
- * Details finden Sie in der GNU General Public License. Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
|
|
|
- * Programm erhalten haben. Falls nicht, schreiben Sie an die Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
|
- * 02111-1307, USA. #######################################################################################
|
|
|
- */
|
|
|
-
|
|
|
#include "mmc.h"
|
|
|
#include <util/delay.h>
|
|
|
-
|
|
|
- // ############################################################################
|
|
|
- // Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE)
|
|
|
-unsigned char mmc_init()
|
|
|
-// ############################################################################
|
|
|
+uint8_t mmc_init()
|
|
|
{
|
|
|
- unsigned int Timeout = 0, i;
|
|
|
+ uint16_t Timeout = 0, i;
|
|
|
|
|
|
// Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde
|
|
|
- DDRC |= ((1 << MMC_DO) | (1 << MMC_CS) | (1 << MMC_CLK));
|
|
|
- DDRC &= ~(1 << MMC_DI);
|
|
|
- PORTC |= ((1 << MMC_DO) | (1 << MMC_DI) | (1 << MMC_CS));
|
|
|
+ DDRB |= ((1 << MMC_DO) | (1 << MMC_CS) | (1 << MMC_CLK));
|
|
|
+ DDRB &= ~(1 << MMC_DI);
|
|
|
+ PORTB |= ((1 << MMC_DO) | (1 << MMC_DI) | (1 << MMC_CS));
|
|
|
|
|
|
// Wartet eine kurze Zeit
|
|
|
- _delay_ms(10);
|
|
|
+ _delay_ms(20);
|
|
|
|
|
|
// Initialisiere MMC/SD-Karte in den SPI-Mode
|
|
|
for (i = 0; i < 250; i++) {
|
|
|
- PORTC ^= (1 << MMC_CLK);
|
|
|
+ PORTB ^= (1 << MMC_CLK);
|
|
|
_delay_us(4);
|
|
|
}
|
|
|
- PORTC &= ~(1 << MMC_CLK);
|
|
|
+ PORTB &= ~(1 << MMC_CLK);
|
|
|
_delay_us(10);
|
|
|
- PORTC &= ~(1 << MMC_CS);
|
|
|
+ PORTB &= ~(1 << MMC_CS);
|
|
|
_delay_us(3);
|
|
|
|
|
|
// Sendet Commando CMD0 an MMC/SD-Karte
|
|
|
- unsigned char CMD[] = { 0x40, 0x00, 0x00, 0x00, 0x00, 0x95 };
|
|
|
+ uint8_t CMD[] = { 0x40, 0x00, 0x00, 0x00, 0x00, 0x95 };
|
|
|
while (mmc_write_command(CMD) != 1) {
|
|
|
if (Timeout++ > 20) {
|
|
|
MMC_Disable();
|
|
|
- printf("fail1\n");
|
|
|
return (1); // Abbruch bei Commando1 (Return Code1)
|
|
|
}
|
|
|
}
|
|
@@ -55,7 +38,6 @@ unsigned char mmc_init()
|
|
|
while (mmc_write_command(CMD) != 0) {
|
|
|
if (Timeout++ > 800) {
|
|
|
MMC_Disable();
|
|
|
- printf("fail2\n");
|
|
|
return (9); // Abbruch bei Commando2 (Return Code2)
|
|
|
}
|
|
|
}
|
|
@@ -64,12 +46,12 @@ unsigned char mmc_init()
|
|
|
|
|
|
// ############################################################################
|
|
|
// Sendet ein Commando an die MMC/SD-Karte
|
|
|
-unsigned char mmc_write_command(unsigned char *cmd)
|
|
|
+uint8_t mmc_write_command(uint8_t *cmd)
|
|
|
// ############################################################################
|
|
|
{
|
|
|
- unsigned char tmp = 0xff;
|
|
|
- unsigned int Timeout = 0;
|
|
|
- unsigned char a;
|
|
|
+ uint8_t tmp = 0xff;
|
|
|
+ uint16_t Timeout = 0;
|
|
|
+ uint8_t a;
|
|
|
|
|
|
// sendet 6 Byte Commando
|
|
|
for (a = 0; a < 0x06; a++) // sendet 6 Byte Commando zur MMC/SD-Karte
|
|
@@ -89,22 +71,22 @@ unsigned char mmc_write_command(unsigned char *cmd)
|
|
|
|
|
|
// ############################################################################
|
|
|
// Routine zum Empfangen eines Bytes von der MMC-Karte
|
|
|
-unsigned char mmc_read_byte(void)
|
|
|
+uint8_t mmc_read_byte(void)
|
|
|
// ############################################################################
|
|
|
{
|
|
|
uint8_t Byte = 0, j;
|
|
|
for (j = 0; j < 8; j++) {
|
|
|
Byte = (Byte << 1);
|
|
|
- PORTC |= (1 << MMC_CLK);
|
|
|
+ PORTB |= (1 << MMC_CLK);
|
|
|
_delay_us(4);
|
|
|
- if (PINC & (1 << MMC_DI)) {
|
|
|
+ if (PINB & (1 << MMC_DI)) {
|
|
|
Byte |= 1;
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
Byte &= ~1;
|
|
|
}
|
|
|
- PORTC &= ~(1 << MMC_CLK);
|
|
|
+ PORTB &= ~(1 << MMC_CLK);
|
|
|
_delay_us(4);
|
|
|
}
|
|
|
return (Byte);
|
|
@@ -112,38 +94,38 @@ unsigned char mmc_read_byte(void)
|
|
|
|
|
|
// ############################################################################
|
|
|
// Routine zum Senden eines Bytes zur MMC-Karte
|
|
|
-void mmc_write_byte(unsigned char Byte)
|
|
|
+void mmc_write_byte(uint8_t Byte)
|
|
|
// ############################################################################
|
|
|
{
|
|
|
uint8_t i;
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
if (Byte & 0x80) {
|
|
|
- PORTC |= (1 << MMC_DO);
|
|
|
+ PORTB |= (1 << MMC_DO);
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
- PORTC &= ~(1 << MMC_DO);
|
|
|
+ PORTB &= ~(1 << MMC_DO);
|
|
|
}
|
|
|
Byte = (Byte << 1);
|
|
|
- PORTC |= (1 << MMC_CLK);
|
|
|
+ PORTB |= (1 << MMC_CLK);
|
|
|
_delay_us(4);
|
|
|
- PORTC &= ~(1 << MMC_CLK);
|
|
|
+ PORTB &= ~(1 << MMC_CLK);
|
|
|
_delay_us(4);
|
|
|
}
|
|
|
- PORTC |= (1 << MMC_DO);
|
|
|
+ PORTB |= (1 << MMC_DO);
|
|
|
}
|
|
|
|
|
|
// ############################################################################
|
|
|
// Routine zum schreiben eines Blocks(512Byte) auf die MMC/SD-Karte
|
|
|
-unsigned char mmc_write_sector(unsigned long addr, unsigned char *Buffer)
|
|
|
+uint8_t mmc_write_sector(uint32_t addr, uint8_t *Buffer)
|
|
|
// ############################################################################
|
|
|
{
|
|
|
- unsigned char tmp;
|
|
|
+ uint8_t tmp;
|
|
|
|
|
|
// Commando 24 zum schreiben eines Blocks auf die MMC/SD - Karte
|
|
|
- unsigned char cmd[] = { 0x58, 0x00, 0x00, 0x00, 0x00, 0xFF };
|
|
|
- unsigned char a;
|
|
|
- unsigned int i;
|
|
|
+ uint8_t cmd[] = { 0x58, 0x00, 0x00, 0x00, 0x00, 0xFF };
|
|
|
+ uint8_t a;
|
|
|
+ uint16_t i;
|
|
|
|
|
|
/*
|
|
|
* Die Adressierung der MMC/SD-Karte wird in Bytes angegeben, addr wird von Blocks zu Bytes umgerechnet danach werden diese in
|
|
@@ -188,11 +170,11 @@ unsigned char mmc_write_sector(unsigned long addr, unsigned char *Buffer)
|
|
|
|
|
|
// ############################################################################
|
|
|
// Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes)
|
|
|
-void mmc_read_block(unsigned char *cmd, unsigned char *Buffer,
|
|
|
- unsigned int Bytes)
|
|
|
+void mmc_read_block(uint8_t *cmd, uint8_t *Buffer,
|
|
|
+ uint16_t Bytes)
|
|
|
// ############################################################################
|
|
|
{
|
|
|
- unsigned int a;
|
|
|
+ uint16_t a;
|
|
|
|
|
|
// Sendet Commando cmd an MMC/SD-Karte
|
|
|
if (mmc_write_command(cmd) != 0) {
|
|
@@ -215,12 +197,12 @@ void mmc_read_block(unsigned char *cmd, unsigned char *Buffer,
|
|
|
|
|
|
// ############################################################################
|
|
|
// Routine zum lesen eines Blocks(512Byte) von der MMC/SD-Karte
|
|
|
-unsigned char mmc_read_sector(unsigned long addr, unsigned char *Buffer)
|
|
|
+uint8_t mmc_read_sector(uint32_t addr, uint8_t *Buffer)
|
|
|
// ############################################################################
|
|
|
{
|
|
|
|
|
|
// Commando 16 zum lesen eines Blocks von der MMC/SD - Karte
|
|
|
- unsigned char cmd[] = { 0x51, 0x00, 0x00, 0x00, 0x00, 0xFF };
|
|
|
+ uint8_t cmd[] = { 0x51, 0x00, 0x00, 0x00, 0x00, 0xFF };
|
|
|
|
|
|
/*
|
|
|
* Die Adressierung der MMC/SD-Karte wird in Bytes angegeben, addr wird von Blocks zu Bytes umgerechnet danach werden diese in
|
|
@@ -236,24 +218,24 @@ unsigned char mmc_read_sector(unsigned long addr, unsigned char *Buffer)
|
|
|
|
|
|
// ############################################################################
|
|
|
// Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes)
|
|
|
-unsigned char mmc_read_cid(unsigned char *Buffer)
|
|
|
+uint8_t mmc_read_cid(uint8_t *Buffer)
|
|
|
// ############################################################################
|
|
|
{
|
|
|
|
|
|
// Commando zum lesen des CID Registers
|
|
|
- unsigned char cmd[] = { 0x4A, 0x00, 0x00, 0x00, 0x00, 0xFF };
|
|
|
+ uint8_t cmd[] = { 0x4A, 0x00, 0x00, 0x00, 0x00, 0xFF };
|
|
|
mmc_read_block(cmd, Buffer, 16);
|
|
|
return (0);
|
|
|
}
|
|
|
|
|
|
// ############################################################################
|
|
|
// Routine zum lesen des CSD Registers von der MMC/SD-Karte (16Bytes)
|
|
|
-unsigned char mmc_read_csd(unsigned char *Buffer)
|
|
|
+uint8_t mmc_read_csd(uint8_t *Buffer)
|
|
|
// ############################################################################
|
|
|
{
|
|
|
|
|
|
// Commando zum lesen des CSD Registers
|
|
|
- unsigned char cmd[] = { 0x49, 0x00, 0x00, 0x00, 0x00, 0xFF };
|
|
|
+ uint8_t cmd[] = { 0x49, 0x00, 0x00, 0x00, 0x00, 0xFF };
|
|
|
mmc_read_block(cmd, Buffer, 16);
|
|
|
return (0);
|
|
|
}
|