This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28377D:SPI 通信的位移问题

Guru**** 2301880 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1518389/tms320f28377d-bit-shift-problem-of-spi-communication

器件型号:TMS320F28377D

工具/软件:

您好:

我正在尝试通过 SPI 通信读取 adxl345的器件 ID。
它应该是11100101、但结果是11110010。
我认为它是向右移动的。

这是我的代码。  

void readFromSPI (Uint16 _reg_address、int num、Uint16 _buff[])

uint16 _address = 0x0080 |_reg_address;

//如果读取多字节:设置位6
if (num > 1){
_ADDRESS =_ADDRESS | 0x0040;
}

//将 Rx FIFO 指针重置为零
SPI_resetRxFIFO (SPIB_BASE);
SPI_resetTxFIFO (SPIB_BASE);

GpioDataRegs.GPACLEar.bit.GPIO27 = 1;

int i=0;

_buff[i]= SPI_transmitreceiveByteOnceMine (SPIB_BASE、8U、_address);


printf ("%d:%d\n"、i、_buff[i]);

GpioDataRegs.GPASSET.bit.GPIO27 = 1;  


}

uint16_t
SPI_transmitreceiveByteOnceMine (uint32_t base、uint16_t charLength、uint16_t 数据)

uint16_t rxData =0;
uint16_t rxDataEmu =0;

assert (((HWREGH (BASE + SPI_O_CCR)& SPI_CCR_SPICHAR_M)+ 1)== charLength);

SPI_disableFIFO (base);//禁用 FIFO 寄存器
SPI_enableFIFO (BASE);//启用 FIFO 寄存器

//写入 SPI 发送缓冲区
//我想读的内容
SPI_writeDataBlockingFIFO (base、(data<<(16U - charLength))&0xFF00);

while (SPI_getRxFIFOStatus (base)< SPI_FIFO_RX1)

}
rxData = SPI_readDataBlockingFIFO (base);

//写入虚拟数据
SPI_writeDataBlockingFIFO (base、0x0000);

while (SPI_getRxFIFOStatus (base)< SPI_FIFO_RX1)

}
//读取数据
rxData = SPI_readDataBlockingFIFO (base);
printf ("Receive:%d\n"、rxData);

return (rxData);
}

这是 SPI 设置。

void mySPIB_init (void)

//在配置之前、必须将 SPI 置于复位状态
//
SPI_disableModule (SPIB_BASE);

SPI_setConfig (SPIB_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL1PHA1、
SPI_MODE_CONTROLLER、mySPI0_bitrate、mySPI0_DATAWIDTH);
SPI_setPTESignalPolarity (SPIB_BASE、SPI_PTE_ACTIVE_LOW);
SPI_disableLoopback (SPIB_BASE);
spi_setEmulationMode (SPIB_BASE、spi_emulation_stop_after_transmit);

//
// FIFO 和中断配置
//
SPI_enableFIFO (SPIB_BASE);
SPI_setFIFO InterruptLevel (SPIB_BASE、SPI_FIFO_TXEMPTY、SPI_FIFO_RX1);
SPI_clearInterruptStatus (SPIB_BASE、SPI_INT_RXFF);
SPI_enableInterrupt (SPIB_BASE、SPI_INT_RXFF);

//
//配置完成。 启用模块。
//
SPI_enableModule (SPIB_BASE);
}

我不知道问题是什么。

请帮帮我。

此致、

WooJoung Lim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    根据 adxl345的数据表、复位时的器件 ID 为0b11100101、您是正确的。

    一目了然、我没有看到任何明显的问题。 但是、我不确定有一件事、为什么您在发送/接收功能中禁用和重新启用 FIFO?

    此致、
    Jason Osborn