当前位置: 代码迷 >> 单片机 >> 大家帮小弟我看看这个程序怎么
  详细解决方案

大家帮小弟我看看这个程序怎么

热度:81   发布时间:2016-04-28 15:39:58.0
大家帮我看看这个程序如何?
本帖最后由 XiangJianHeTaiJi 于 2012-12-02 02:57:28 编辑
最近在弄无线收发模块,虽然歪打误撞搞定了,但是对于函数有点疑问,是连续读的函数,总是出问题,下面有四个版本,都是自己写的,第一个是最终修正好的,能实现的。其余三个都是不能实现的,读出来的是乱码。我感觉很奇怪,四个函数怎么看都是同样的功能,但是为什么后面三个无法成功表达呢?
麻烦各位有经验的大哥们给看一下哈,给指点一下。小弟先谢过了。


在这里补贴一个:
void SPI_WR(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
mosi = dat&0x80;
dat = dat<<1;
sck = 1;
sck = 0;
}
}

最终修正版
uchar SPI_RD()//读一个字节
{
uchar i;
for(i=0;i<8;i++)
{
ACC = ACC<<1;//ACC是寄存器
ACC0 = miso;//sbit ACC0 = ACC^0;
sck = 1;
sck = 0;
}
return ACC;
}

void SPI_RD_REG(uchar com,uchar *p,uchar n)//读数据命令,存放数据的地址,读的字节个数
{
uchar j;
csn = 1;
csn = 0;
SPI_WR(com);
for(j=0;j<n;j++)
{
p[j] = SPI_RD();
}
csn = 1;
}


错误版本1
void SPI_RD_REG(uchar com, uchar n)//读数据命令,读的字节个数
{
uchar i,j;
csn = 1;
csn = 0;
SPI_WR(com);
for(j=0;j<n;j++)
{
for(i=0;i<8;i++)
{
ACC = ACC<<1;
ACC0 = miso;
sck = 1;
sck = 0;
}
RX_PLD[j] = ACC;//将数据读出到unsigned char类型数组中去
}
csn = 1;
}

错误版本2:
void SPI_RD_REG(uchar com, uchar *p,uchar n)//读数据命令,存放数据的地址,读的字节个数
{
Uchar i,j;
csn = 1;
csn = 0;
SPI_WR(com);
for(j=0;j<n;j++)
{
for(i=0;i<8;i++)
{
*p = *p <<1;//本意是对象左移一位,这样写会不会有问题?
*p = miso;
sck = 1;
sck = 0;
}
P++;
}
csn = 1;
}

错误版本3:
void SPI_RD_REG(uchar com, uchar n)//读数据命令,存放数据的地址,读的字节个数
{
uchar i,j;
csn = 1;
csn = 0;
SPI_WR(com);
for(j=0;j<n;j++)
{
for(i=0;i<8;i++)
{
RX_PLD[j] = RX_PLD[j] <<1//这样写呢,有任何问题么?
RX_PLD[j]= miso;
sck = 1;
sck = 0;
}
}
csn = 1;
}


------解决方案--------------------
后面三个能读出来乱码的话感觉还是时序上的问题,再调整下SPI的时序看看
------解决方案--------------------
RX_PLD是全局数组?其他地方有没有对它操作,改变了数据?
另外单步调试吧
------解决方案--------------------
单步调试,看是在哪一步数据出错
------解决方案--------------------
调试就算了,用示波器看看时序,数据倒是很必要的。

示波器-〉单步采样。

1     不清楚具体RX_PLD是什么。
2、3  显然错。指针不是这么用的。
引用
            *p = *p <<1;
            *p = miso;

按照你的意思应该是p[0] = miso。
------解决方案--------------------
p如果是数组p[]的话。*p就是p[0]。

如果RX_PLD[]是一个全局数组的话,那和p[]中的值就不应有区别。

90%是你的程序哪儿出了问题,或者什么知识点你没注意到。
  相关解决方案