Я хочу передать и получить данные с моего микроконтроллера на мой чип памяти SPI с 4 байтами (256 октетов), я разработал свой код ниже, я хочу написать несколько байтов, затем прочитать их из функции чтения, но я получаю другое значение в 4 байта (например, я отправляю 0x10011111, я получаю A100A1F0)
В таблице данных микросхемы памяти нет информации о передаче страницы (256 бит), и передача данных всегда выполняется в двухбайтовом формате (1 слово = 16 бит).
это мой код для записи 4 байта:
void ecrire4OctetsFRAM(uint32_t const addressRegister, uint32_t const fourBytes, uint8_t const slaAddress)
{
if (fourBytes != lire4OctetsFRAM(addressRegister, slaAddress))
{
if(addressRegister%4)
{
ecrire1OctetFRAM(addressRegister+3,(uint32_t) (fourBytes>> 24),FRAM);
ecrire1OctetFRAM(addressRegister+2,(uint32_t) (fourBytes>> 16),FRAM);
ecrire1OctetFRAM(addressRegister+1,(uint32_t) (fourBytes>> 8),FRAM);
ecrire1OctetFRAM(addressRegister, (uint32_t) (fourBytes) ,FRAM);}
else
{
uint8_t tries(0);
do
{
error = 0;
positionnerPointeur(addressRegister, slaAddress);
if (error) continue;
transfer((uint8_t) (fourBytes));
if (error) continue;
transfer((uint8_t) (fourBytes>> 8));
if (error) continue;
transfer((uint8_t) (fourBytes>>16));
if (error) continue;
transfer((uint8_t) (fourBytes>>24));
release();
} while (error && ++tries < MAX_TRIES);
error = (tries >= MAX_TRIES)? TW_MAX_TRIES: error;
}
}
}
и это для чтения
uint32_t lire4OctetsFRAM (uint32_t const addressregister, uint8_t const slaveadress ){uint32_t fourBytes(0);
uint8_t tries(0);
//**
do
{ error = 0;
positionnerPointeur(addressregister, slaveadress);
select();
transfer(READ);
fourBytes = transfer((uint32_t) ((addressregister >> 24) & 0xFFFF));
fourBytes += transfer((uint32_t) ((addressregister >> 16) & 0xFF));
fourBytes += transfer((uint32_t) ((addressregister >> 8) & 0xFF));
fourBytes +=transfer((uint32_t) ( addressregister & 0xFF));
transfer(0);
fourBytes = SPDR;
fourBytes += (fourBytes << 24) ;
fourBytes += (fourBytes << 16);
fourBytes = (fourBytes << 8);
transfer(0);
fourBytes += SPDR;
release();
}
while (error && ++tries < MAX_TRIES);
error = (tries >= MAX_TRIES)? TW_MAX_TRIES: error;
return fourBytes ;
}
Positionnerpointeur — это функция для указания адреса бита (указатель).
Задача ещё не решена.
Других решений пока нет …