читать адрес из atmel m90e26s используя mcp2210

Я работаю над школьным проектом, в котором мы хотим контролировать потребление энергии с помощью чипа atmel M90e26s.

Я использовал библиотеку mcp2210 и написал этот маленький тестовый скрипт:

void talk(hid_device* handle) {
ChipSettingsDef chipDef;

//set GPIO pins to be CS
chipDef = GetChipSettings(handle);

for (int i = 0; i < 9; i++) {
chipDef.GP[i].PinDesignation = GP_PIN_DESIGNATION_CS;
chipDef.GP[i].GPIODirection = GPIO_DIRECTION_OUTPUT;
chipDef.GP[i].GPIOOutput = 1;
}
int r = SetChipSettings(handle, chipDef);

//configure SPI
SPITransferSettingsDef def;
def = GetSPITransferSettings(handle);

//chip select is GP4
def.ActiveChipSelectValue = 0xffef;
def.IdleChipSelectValue = 0xffff;
def.BitRate = 50000l;
def.SPIMode = 4;

//enable write
byte spiCmdBuffer[3];//read 8 bytes
def.BytesPerSPITransfer = 3;
r = SetSPITransferSettings(handle, def);
if (r != 0) {
printf("Errror setting SPI parameters.\n");
return;
}

spiCmdBuffer[0] = 0x01; //0000 0011 read
spiCmdBuffer[1] = 0x00; //address 0x00

SPIDataTransferStatusDef def1 = SPISendReceive(handle, spiCmdBuffer, 3);

for (int i = 0; i < 8; i++)
printf("%hhu\n", def1.DataReceived[i]);
}

Любой адрес, который я пробую, не отвечает. Проблема выглядит так:

spiCmdBuffer[0] = 0x01; //0000 0011 read
spiCmdBuffer[1] = 0x00; //address 0x00

Я знаю из таблицы данных, что интерфейс spi выглядит так:
интерфейс SPI

Может кто-нибудь помочь мне найти регистры адресов от atm90e26? Все адреса выглядят как «01H», но это не шестнадцатеричный и не 7-битный.

0

Решение

Да, как вы и подозревали, проблема в том, как вы устанавливаете содержимое spiCmdBuffer. ATM90E26 ожидает, что и флаг чтения / записи, и адрес регистра находятся в первом байте транзакции SPI: флаг чтения / записи должен быть установлен в самый старший бит (значение 1 для чтения из регистра, значение 0 для записи в регистр), в то время как адрес регистра находится в 7 оставшихся битах. Так, например, чтобы прочитать регистр по адресу 0x01 (SysStatus), код будет выглядеть так:

spiCmdBuffer[0] = 0x80 | 0x01;  // read System Status

Значение 0x80 устанавливает флаг чтения / записи в старшем значащем бите, а другое значение указывает адрес регистра. Второй и третий байты 3-байтовой последовательности чтения не должны быть установлены на что-либо, так как они игнорируются ATM90E26.

После вызова SPISendReceive () для извлечения содержимого регистра (16 битов) необходимо прочитать второй и третий байт (MSB сначала) из данных, полученных в транзакции чтения, как показано ниже:

uint16_t regValue = (((uint16_t)def1.DataReceived[1]) << 8) | def1.DataReceived[2];
0

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

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

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