如题,主机发送{0,0,0,0},想要得到的从机应答{0x00,0x70,0x53,0xb0};实际获取的应答为{0x70,0x53,0xb0,0x00}。
中断程序如下:
- uint32_t spi_TxBuff = 0x00000000;
- uint32_t DataRegs[10];
- #define OFFSET_0 24
- uint8_t offsetbits = OFFSET_0;
- uint8_t rw_Flag;//0x00:read,0x80:write,=data & 0x80;
- uint8_t reg_Address;//=data & 0x7F;
- void SPI2_IRQHandler(void)
- {
- uint8_t data;
-
- if (SPI2->SR & 0x1)
- {
- data = SPI_ReceiveData8(SPI2);
-
- rw_Flag = data & 0x80;
- reg_Address = data & 0x7F;
-
- if (rw_Flag != 0x00)
- {
- //write to regs
-
- //SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, DISABLE);
- }
- else
- {
- //read from regs
- if (reg_Address < 10)
- {
- if (offsetbits == OFFSET_0)
- {
- spi_TxBuff = DataRegs[reg_Address];
- }
- }
- else
- {
- spi_TxBuff = 0x00FFFFFF;
- }
- }
- }
-
- if (SPI2->SR & 0x2)
- {
- SPI_SendData8(SPI2, (0xFF & (spi_TxBuff >> offsetbits)));
-
- if (offsetbits >= 8)
- {
- offsetbits -= 8;
- }
- else
- {
- offsetbits = OFFSET_0;
- }
- }
- }
- void EXTI4_15_IRQHandler(void)
- {
- EXTI->PR ^= (uint16_t)~EXTI_Line11;
- offsetbits = OFFSET_0;
- }
复制代码
|
SPI的主/从的初始化代码:
因为从设备启用了硬件NSS,所以在片选为高的情况下,硬件应答是0xFF;同时在片选上升沿通过EXTI中断复位偏移量(offsetbits)。
----------------------------------------------------------------------------------------------------
收到数据0x00后,依次发送spi_TxBuff的【31:24】【23:16】【15:8】【7:0】。
我就是想知道啊!不知道程序哪边有问题,重点怀疑是中断函数中的处理机制。
offsetbits = 24;
这个在收到数据以后再开启试试吧。可能是先发送了一次,导致你的程序没有收到最先发送的。这个开启以后,只要是发送寄存器为空就会进入中断。
2:你看看你的代码是不是把0x00给滤掉了
可以换种模式试试。