ATMEGA8A + SPI内存奇怪的行为
我已经购买了SPI内存MX25L8006EPI,现在我尝试将它连接到ATMEGA8A进行测试。 原理图非常简单,不会因互联网而改变:
ATMEGA8A工作在8Mz内部振荡器,3.3V。 熔丝为高电平:0xD1,低电平:0xE4。
我使用Atmel Studio 7编码和AVRISP mkII编程uC。 由于EEPROM需要3.3V电压,因此您可以使用LM317连接5V 700mA电源模块,如您所见。 无论如何,我认为这不重要。
代码也很简单,我已经从互联网的某个页面复制了一部分代码:
#define SLAVESELECT (PORTB &= ~(1<<PORTB2))
#define SLAVEDESELECT (PORTB |= (1<<PORTB2))
#define WREN 6
#define WRDI 4
#define RDSR 5
#define WRSR 1
#define READ 3
#define WRITE 2
#define RDID 0x9F
#define byte unsigned char
void SPI_Init()
{
DDRB = (1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5);
SLAVEDESELECT;
//SPSR |= (1<<SPI2X);
SPCR |= (1<<SPE)|(1<<MSTR)|(1 << SPR1);
_delay_ms(10);
}
byte SPI_Transfer(volatile byte data)
{
SPDR = data;
while (!(SPSR & (1<<SPIF)));
return SPDR;
}
void Get_Identification(byte data[3])
{
SLAVESELECT;
SPI_Transfer(RDID);
data[0] = SPI_Transfer(0xFF);
data[1] = SPI_Transfer(0xFF);
data[2] = SPI_Transfer(0xFF);
SLAVEDESELECT;
}
byte GetStatus()
{
byte status;
SLAVESELECT;
SPI_Transfer(RDSR);
status = SPI_Transfer(0xFF);
SLAVEDESELECT;
return status;
}
void SetWriteEnable(short ebable)
{
SLAVESELECT;
SPI_Transfer((ebable != 0) ? WREN : WRDI);
SLAVEDESELECT;
}
void SetStatus(byte status)
{
SetWriteEnable(1);
SLAVESELECT;
SPI_Transfer(WRSR);
SPI_Transfer(status);
SLAVEDESELECT;
_delay_ms(100);
}
int main(void)
{
SPI_Init();
byte status = 0x1C;
DEBUG_PRINT("rnSet status:%drn",status);
SetStatus(status);
status = GetStatus();
DEBUG_PRINT("rnGet status:%drn",status);
byte buffer[3];
Get_Identification(buffer);
DEBUG_PRINT("Byte0:%xrn", buffer[0]);
DEBUG_PRINT("Byte1:%xrn", buffer[1]);
DEBUG_PRINT("Byte2:%xrn", buffer[2]);
while (1)
{
}
}
DEBUG_PRINT
是我通过USART发送格式化字符串的函数。 我用它来打印出调试信息。
一切看起来都很好,但是当我运行时,我得到一些奇怪的行为。 输出是:
Set status:28
Get status:24
Byte0:80
Byte1:0
Byte2:10
首先我使用WRSR
操作码设置状态寄存器。 它应该将其设置为00011100,但是当我使用RDSR
操作码读取状态时,我获得了00011000。
好的,也许状态寄存器有一些问题。 然后我尝试使用RDID
操作码读取ID寄存器。 它应该返回3个字节 - 0xC2 0x20 0x14。 但insted我得到0x80 0x0 0x10。
如果我没有回答或全部为0x00或0xFF,这将是可以理解的。 但是在这里我读了一些答案,答案是完全错误的问题。 更有趣的是,如果我使用至少相同的代码将EEPROM连接到Arduino,它的工作没有问题。
我觉得这个问题很小。 它看起来也许是一些数据顺序错误或传输速度或类似的东西,但我不能得到它的工作。
根据此数据表,当BP2:0设置为5,6或7时,所有块都受到保护。也许,当将其设置为7时,内存仅将其设置为6,因为它没有区别。
链接地址: http://www.djcxy.com/p/78611.html