Чтение из Раба с SPI

Я работаю с Atmega328p и я пишу программу, которая может читать и писать с микроконтроллера и чипа памяти,

Я попытался написать вкладку, и она была написана правильно, но когда я хочу прочитать вкладку с микросхемы памяти, я получаю номер 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;
}

0

Решение

На самом деле вы отправляете байт за байт (unsigned char) через SPI в качестве регистра данных SPI SPDR всего 8 бит в ширину, см. таблицу данных стр. 224.

Также вы обычно используете одну функцию для отправки и получения, ниже приведена типичная реализация как для приема, так и для отправки. Функция от Вот где 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 значение так, что регистр переполнен.


Далее вы должны отправить правильные команды на ваш чип памяти. Вы должны выбрать направление READ или же WRITE а также адрес ячейки памяти, отправив ADDR, Если адресная комната больше одного байта, вы должны отправить отдельные байты.

Вы должны найти его в техническом описании вашего контроллера памяти. Вот также хороший пример, который может помочь.


Редактировать № 1:

Что касается таблица данных вашего контроллера памяти Вы должны учитывать следующие моменты:

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):

В режиме последовательной связи, если LSI
выдает ошибку при выполнении команды READ / WRITE,
коды ошибок будут сохранены в
Регистр информации об ошибках SPI.

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

Лист данных очень подробный о связи, а также есть временные диаграммы и диаграммы связи. Отправьте команды, как я сказал, но байт на байт, потому что SPDR регистр всего 8 бит в ширину. Сделайте это, как функция, которую я предоставил, и она должна работать.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector