0

我正在开展一个学校项目,我们希望使用 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 interface

有人可以帮我从 atm90e26 中找到地址寄存器吗?所有地址看起来都像“01H”,但这不是十六进制,也不是 7 位。

4

1 回答 1

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];
于 2018-11-01T16:55:50.390 回答