MicroSD卡和SPI

MicroSD卡和SPI,c,embedded,spi,atmega,C,Embedded,Spi,Atmega,我正试图通过SPI程序在MicroSD卡上读/写。通过示波器,我看到CS、MOSI和CLK工作正常。 “正确”的意思是CS向上,但当我发送CMD时,它变低,然后再次向上;MOSI正确发送CMD,在第一次CLK之前一点,此时在味噌中,我尝试捕捉一些东西;时钟:它在两个正面之间制造大约4美元的时钟。 我在CMD0上发送10 x 0xFF,并且在任何CMD之后都这样做。 我发送: 但我看到的是味噌上的1 只有当MicroSD卡在读卡器中时才会发生。如果不是,味噌总是1 我尝试的MicroSD卡是2 G

我正试图通过SPI程序在MicroSD卡上读/写。通过示波器,我看到CS、MOSI和CLK工作正常。 “正确”的意思是CS向上,但当我发送CMD时,它变低,然后再次向上;MOSI正确发送CMD,在第一次CLK之前一点,此时在味噌中,我尝试捕捉一些东西;时钟:它在两个正面之间制造大约4美元的时钟。 我在CMD0上发送10 x 0xFF,并且在任何CMD之后都这样做。 我发送:

但我看到的是味噌上的1

只有当MicroSD卡在读卡器中时才会发生。如果不是,味噌总是1

我尝试的MicroSD卡是2 Gb和4 Gb。也许这是卑鄙的。如果我将它们连接到我的电脑,它们就会工作

如果有用的话,我会在这里写代码来写字节

for(int bit = 0; bit < 8; bit++)

    {

        if (byte & 0x80)
            PORTG |=SPI_MOSI;
        else
            PORTG &= ~SPI_MOSI;
        PORTG |= SPI_CLK;
        byte |= (PINE & SPI_MISO)>>6;
        byte <<= 1;
        PORTG &= ~SPI_CLK;
    }
for(int位=0;位<8;位++)
{
if(字节&0x80)
PORTG |=SPI|u MOSI;
其他的
PORTG&=~SPI_MOSI;
PORTG |=SPI|U CLK;
字节|=(松树和豆酱)>>6;

字节“第一次时钟前一位”这听起来不对。您可以将SPI配置为在上升或下降时钟边缘(时钟极性)时钟输出,并将其配置为从时钟边缘发送半位延迟(时钟相位调整)。但您无法将其配置为在第一个时钟边缘之前发送数据。MicroSD卡可能不支持SPI模式。注意:如果您需要特定的位宽度,请使用固定宽度类型。@Lundin对不起,我在这里看到的是时钟前1uS的位:。我误解了吗?我正在制作SPI,非硬件。@Lundin:一些SPI外围设备设置了第一位在某些POL/PHA组合中,在时钟边缘(可能是选通的wit
SS
)之前。不确定这是否适用于ATmega,尽管“在第一次时钟之前一点”听起来不正确。您可以将SPI配置为在上升或下降时钟边缘(时钟极性)处时钟停止,您可以将其配置为从时钟边缘以半位延迟发送(时钟相位调整)。但您无法将其配置为在第一个时钟边缘之前发送数据。MicroSD卡可能不支持SPI模式。注意:如果您需要特定的位宽度,请使用固定宽度类型。@Lundin对不起,我在这里看到的是时钟前1uS的位:。我误解了吗?我正在制作SPI,非硬件。@Lundin:一些SPI外围设备设置了第一位在某些POL/PHA组合中,在时钟边缘(可能是选通的wit
SS
)之前。但不确定ATmega是否如此
for(int bit = 0; bit < 8; bit++)

    {

        if (byte & 0x80)
            PORTG |=SPI_MOSI;
        else
            PORTG &= ~SPI_MOSI;
        PORTG |= SPI_CLK;
        byte |= (PINE & SPI_MISO)>>6;
        byte <<= 1;
        PORTG &= ~SPI_CLK;
    }