本帖最后由 liubin1109 于 2013-4-2 00:52 编辑
调了老半天,咋就错开一个byte呢?
请看程序:
void ISP_Write(uchar *a,uchar n) //写8个位//这个函数没问题
{
for(;n>0;n--)
{
while(!SPI_SR_TXE); //如果发送缓冲区非空则等待发送完
SPI_DR = *a; //内存地址的数据移到发送缓冲区
a++; //内存地址加1
}
}
void ISP_Read(uchar b) //写一个指令b=0x1E,返回3个8位数据
{
uchar i;
PE_ODR_ODR5 = 0;
ISP_Write(&b,1);
while(!SPI_SR_TXE); //如果发送缓冲区非空则等待发送完
for(i=1;i<4;i++)
{
SPI_DR;
while(!SPI_SR_TXE); //如果发送缓冲区非空则等待发送完
SPI_DR = 0xFF; //假写
while(!SPI_SR_RXNE); //接收缓冲区为空,等待接收完
buf=SPI_DR; //数组有buf[4];//接收到的数据放在buf[1]~[3];
}
while(SPI_SR_BSY); //等待通讯结束
PE_ODR_ODR5 = 1; //CS释放为高
}
结果请看下图:
把程序修改成:
for(i=0;i<3;i++)
{
SPI_DR;
while(!SPI_SR_TXE); //如果发送缓冲区非空则等待发送完
SPI_DR = 0xFF; //假写
while(!SPI_SR_RXNE); //接收缓冲区为空,等待接收完
buf=SPI_DR; //数组有buf[4];//接收到的数据放在buf[1]~[3];
}
while(!SPI_SR_RXNE); //接收缓冲区为空,等待接收完
buf[3]=SPI_DR;
while(SPI_SR_BSY); //等待通讯结束
PE_ODR_ODR5 = 1; //CS释放为高
看起来是正常,可不明白这是为什么!结果请看下图:
|