gpt4 book ai didi

c++ - 使用 SPI 从从机读取

转载 作者:行者123 更新时间:2023-11-27 23:53:11 27 4
gpt4 key购买 nike

我正在使用 Atmega328p,我正在编写一个可以从微 Controller 和存储芯片读取和写入的程序,

我尝试写入制表符并且写入正确,但是当我想从内存芯片读取制表符时,我收到编号 255,我无法专门化这个错误!

有人可以帮助我吗?

uint16_t read_SPI (uint16_t address){
Slave_select;
SPDR= address;
while(!(SPSR & (1<<SPIF)));
Slave_deselect;
return (SPDR);
}


void write_SPI (uint16_t address, uint16_t byte){
Slave_select;
SPDR=byte;
while(!(SPSR & (1<<SPIF)));
//address=SPDR;
/*SPI_tradeByte(0x02);
chip_send16BitAdress(address);
SPI_tradeByte(byte);*/
Slave_deselect;
}

最佳答案

实际上,您通过 SPI 每字节发送一个字节 (unsigned char),因为 SPI 数据寄存器 SPDR 仅为 8 位宽,see datasheet第 224 页。

同样,您通常使用一个函数来发送和接收,下面是一个典型的接收和发送函数的实现。函数来自here其中 SPI 得到了很好的解释。

//Function to send and receive data for both master and slave
unsigned char spi_tranceiver (unsigned char data)
{
// Load data into the buffer
SPDR = data;

//Wait until transmission complete
while(!(SPSR & (1<<SPIF) ));

// Return received data
return(SPDR);
}

与您的代码有很大不同的是,您将 SPDR 设置为 uint16_t 值,以便寄存器溢出。


此外,您必须向您的存储芯片发送正确的命令。您必须选择方向 READWRITE 并通过发送 ADDR 寻址存储单元。如果地址空间大于一个字节,则必须发送单独的字节。

您必须在内存 Controller 的数据表中查找它。 Here也是一个很好的例子,可以提供帮助。


编辑#1:

关于 datasheet of your memory controller您必须考虑以下几点:

<强>1。阅读(数据表第 19 页):

要从您必须发送的芯片中读取:

0x03            = 0b00000011:          8 bit  READ command
0x0000 - 0x07FF = 0bXXXXXAAA AAAAAAAA: 16 bit ADDRESS (5 upper bits don't care)

然后你会收到:

0x0000 - 0xFFFF = 0bDDDDDDDD DDDDDDDD: 16 bit DATA

<强>2。写入(数据表第 19 页):

要写入您必须发送的芯片:

0x02            = 0b00000010:          8 bit  WRITE command
0x0000 - 0x07FF = 0bXXXXXAAA AAAAAAAA: 16 bit ADDRESS (5 upper bits don't
0x0000 - 0xFFFF = 0bDDDDDDDD DDDDDDDD: 16 bit DATA

<强>3。内存布局(数据表第 8 页):

用户内存区域从 0x0000 到 0xA6F。

<强>4。使用 SPI 信息寄存器(数据表第 20 页):

In Serial communication mode, if the LSI encount ers an error when executing a READ/WRITE command, the error codes will be stored in th e SPI Error Information Register.

Bit       15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
Function 0 0 0 0 0 0 0 0 0 0 0 0 | ERROR* |
* : ERROR
b1000 : Low voltage detection
b0100 : Write NG
b0010 : Read NG
b0001 : NG because RF occurred
b0000 : Finished successfully

datasheet 对通信非常详细,还有时序图和通信图。像我说的那样发送命令,但是一个字节一个字节,因为 SPDR 寄存器只有 8 位宽。按照我提供的功能进行操作,它应该可以工作。

关于c++ - 使用 SPI 从从机读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com