首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ATMEGA8A + SPI内存异常行为

ATMEGA8A + SPI内存异常行为
EN

Stack Overflow用户
提问于 2017-08-26 18:31:34
回答 1查看 125关注 0票数 0

我买了SPI memory MX25L8006EPI,现在我试着把它连接到ATMEGA8A上进行测试。该原理图非常简单,不会在互联网上与其他图有所不同:

ATMEGA8A工作在8 8Mz内部振荡器,3.3V。熔断器高电平: 0xD1,低电平: 0xE4。

我使用Atmel Studio7进行编码,使用AVRISP mkII对uC进行编程。由于EEPROM需要3.3V电压,我使用LM317连接了5V 700 on电源模块,正如你在方案中所看到的那样。我觉得这无关紧要但不管怎样..。

代码也很简单,我从互联网上的一些页面上复制了一部分:

代码语言:javascript
复制
#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("\r\nSet status:%d\r\n",status);
    SetStatus(status);
    status = GetStatus();
    DEBUG_PRINT("\r\nGet status:%d\r\n",status);
    byte buffer[3];
    Get_Identification(buffer);
    DEBUG_PRINT("Byte0:%x\r\n", buffer[0]);
    DEBUG_PRINT("Byte1:%x\r\n", buffer[1]);
    DEBUG_PRINT("Byte2:%x\r\n", buffer[2]);

    while (1) 
    {       
    }
}

DEBUG_PRINT是我的函数,用于通过USART发送格式化的字符串。我用它来打印调试信息。

一切看起来都很好,但是当我运行的时候,我得到了一些奇怪的行为。输出为:

代码语言:javascript
复制
Set status:28
Get status:24
Byte0:80
Byte1:0
Byte2:10

首先,我使用WRSR操作码设置状态寄存器。它应该将其设置为00011100,但是当我使用RDSR操作码读取状态时,我得到00011000。

好吧,也许状态寄存器有点问题。然后,我尝试使用RDID操作码读取ID寄存器。它应该返回3个字节- 0xC2 0x20 0x14。但如果我得到0x80 0x0 0x10。

如果我没有得到回答,或者全是0x00或0xFF,这是可以理解的。但我在这里读到了一些答案,这个问题是回答完全错误。更有趣的是,如果我至少使用相同的代码将EEPROM连接到Arduino,它就可以正常工作。

我觉得这个问题很小。它看起来可能是一些数据顺序错误或传输速度或类似的东西,但我不能让它工作。

EN

回答 1

Stack Overflow用户

发布于 2017-08-27 12:18:46

根据此datasheet,当BP2:0设置为5、6或7时,所有块都受到保护。也许当您将其设置为7时,内存仅将其设置为6,因为这没有什么区别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45894412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档