Я работаю с 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;
}
На самом деле вы отправляете байт за байт (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 бит в ширину. Сделайте это, как функция, которую я предоставил, и она должна работать.
Других решений пока нет …