我正在尝试模拟来自 10 位 AEAT-6010 旋转编码器的数据,并将其发送到 ATtiny3217 上 SPI 协议的 MISO 引脚上。ATtiny 充当从机,接收 CLK 和 SS 信号作为输入,通过输出数据(编码器值)来响应。编码器按照SSI协议发送数据,如下图:
当尝试在 ATtiny 上发送 8 位 SPI 协议的 10 位时,就会出现问题。SPI 协议的主控芯片是 TMS320F2808 芯片,我从它接收 11 个时钟脉冲和 SS 信号。测得的信号和数据如下图所示:
这里我尝试发送的数据0b10
只是为了测试。我可以在 MISO 线上看到正确的数据,但信号中间有三个额外的 1。这是在 ATtinyBUFEN=1
的BUFWR=1
SPI 设置中,如下面的配置所示(没有缓冲模式,三个 1 出现在最后 3 位上,并且第一位(MSB)被读取为 1):
int8_t SPI_0_init()
{
SPI0.CTRLA = 0 << SPI_CLK2X_bp /* Enable Double Speed: disabled */
| 0 << SPI_DORD_bp /* Data Order Setting: enabled */
| 1 << SPI_ENABLE_bp /* Enable Module: enabled */
| 0 << SPI_MASTER_bp /* SPI module in slave mode */
| SPI_PRESC_DIV4_gc; /* System Clock / 4 */
SPI0.CTRLB = 1 << SPI_BUFEN_bp /* Buffer Mode Enable: enabled */
| 1 << SPI_BUFWR_bp /* Buffer Write Mode: enabled */
| SPI_MODE_0_gc /* SPI Mode 1 */
| 0 << SPI_SSD_bp; /* Slave Select Disable: disabled */
SPI0.INTCTRL = 0 << SPI_DREIE_bp /* Data Register Empty Interrupt Enable: enabled */
| 1 << SPI_IE_bp /* Interrupt Enable: enabled */
| 0 << SPI_RXCIE_bp /* Receive Complete Interrupt Enable: disabled */
| 0 << SPI_SSIE_bp /* Slave Select Trigger Interrupt Enable: disabled */
| 0 << SPI_TXCIE_bp; /* Transfer Complete Interrupt Enable: disabled */
return 0;
}
我已经确认 TMS320F2808 的 SPI 模块和 ATtiny 的数据是相同的(在时钟下降沿读取)。关于 SPI 的缓冲区如何工作或 SPI 的中断,我是否遗漏了什么?当启用不同的中断(除了清除标志)时,我不确定在 ISR 中要做什么。这是我的主要功能(ISR 暂时为空):
int main(void)
{
/* Initializes MCU, drivers and middleware */
atmel_start_init();
sei(); // Enable global interrupts
/* Replace with your application code */
while (1) {
SPI_transmit(enc_data_L);
}
其中SPI_transmit()
如下:
void SPI_transmit(uint16_t enc_data)
{
// Then start the transmission by assigning the data to the SPI data register
SPI0.DATA = enc_data;
//SPI0.DATA = enc_data_H;
// Now wait for the data transmission to complete by periodically checking the SPI status register
//the SPI_IF is the only interrupt flag with a function in non-buffered mode.
while(!(SPI0.INTFLAGS & (SPI_RXCIF_bm)));
SPI0.DATA; //Dummy read to clear flag
}
我也尝试过按照这里的建议拆分 16 位数据,但问题仍然存在于 8 位数据中。希望这是足够的背景信息。我很感谢任何想法!