本帖最后由 sfesdm 于 2014-5-3 00:37 编辑
在调试STM32F103与W25X64通信的时候,如果不开中断,用查询的方式通信,比如读取器件ID,通信是没问题的。但是使用中断的方式通信,接收到的数据就全都是0XFF,通过逻辑分析仪观察数据,发现中断发送出去的数据(命令)有问题,具体情况如下:
读取器件ID发送的命令
中断发送的程序如下:
读取器件ID调试程序
void ReadDeviceID(void)
{
SPI.start = SPI.sendbuf;
SPI.end = SPI.sendbuf+6;
SPI.sendbuf[0] = 0x90;
SPI.sendbuf[1] = 0x00;
SPI.sendbuf[2] = 0x00;
SPI.sendbuf[3] = 0x00;
SPI.sendbuf[4] = 0xff;
SPI.sendbuf[5] = 0xff;
SPI.recv = 0;//保存接收到的数据
GPIO_ResetBits(GPIOB,GPIO_Pin_12);//拉低FCS
Delay(10);
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_TXE,ENABLE); //打开发送中断
Delay(1000); //等待通信完成
GPIO_SetBits(GPIOB,GPIO_Pin_12);//拉高FCS
}
void SPI2_IRQHandler(void)
{
if(SPI_I2S_GetITStatus(SPI2,SPI_I2S_IT_TXE) != RESET)
{
if(SPI.start < SPI.end)
{
SPI_I2S_SendData(SPI2,SPI.sendbuf[*SPI.start]);
SPI.start++;
SendLen++; //计算发送次数
}
else
{
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_TXE,DISABLE); //发送完成,关闭发送中断
}
}
if(SPI_I2S_GetITStatus(SPI2,SPI_I2S_IT_RXNE) != RESET)
{
SPI.readbuf[SPI.recv] = SPI_I2S_ReceiveData(SPI2);
SPI.recv++;
RecvLen++; //计算接收次数
}
}
逻辑仪观察到的结果
通过观察,发现用于统计发送次数和接收次数的变量,都是相等的。也就是说,有发送,就有接收,而且都是发送6个数据,就接收到6个数据。
但是纳闷的是,通过逻辑仪观察到的结果,发送的第1个数据是0,第2、3、4个数据都是0x90,第5、6个数据本应是0xff的,却又变为0了。
程序的其它地方并没有对SPI.sendbuf进行任何改变,在SPI通信完成后,通过串口把SPI.sendbuf打印出来看到也确实如此。如果是配置有问题,查询方式的通信也应该有问题吧!
请教香主,这样的问题应该从何分析呢?谢谢了!
对不起,我犯了个弱智的错误: SPI.start = SPI.sendbuf;
然后SPI_I2S_SendData(SPI2,SPI.sendbuf[*SPI.start]);
应该是SPI_I2S_SendData(SPI2,*SPI.start);
此帖不删前面的内容,引以为戒!结帖了。
|