首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

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

2013-01-04 
大家帮我看看这个程序如何?在这里补贴一个:void SPI_WR(uchar dat){uchar ifor(i0i8i++){mosi dat&

大家帮我看看这个程序如何?


在这里补贴一个:

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%是你的程序哪儿出了问题,或者什么知识点你没注意到。


[解决办法]
语言问题有点绕。  单独写个C程序试试就知道了。 
说下其他方面:拿示波器看下时序。  我遇到过在驱动中加一条打印,就可以正常获取数据了。 

其实打印也是一种延时,看你程序里,似乎对CLK操作和读取等都没延时,加下看看。 
[解决办法]

引用
您能明示一下么?有劳您啦

不是我不想,你帖子就给了这些信息,实在不能知道是什么错误。上面的回答已经很尽力了。
我也不是大大,相互学习。
[解决办法]
引用:
 
其实打印也是一种延时

打印延时很长的,只建议调试时使用。
[解决办法]
引用:
引用:语言问题有点绕。  单独写个C程序试试就知道了。 
说下其他方面:拿示波器看下时序。  我遇到过在驱动中加一条打印,就可以正常获取数据了。 

其实打印也是一种延时,看你程序里,似乎对CLK操作和读取等都没延时,加下看看。
但是没有理由啊,第一个版本也没有加延时呢,同样可以读出数据来啊。


+_+   你代码逻辑不一样,执行时间不一样, 如果时间足够长,就刚好起到延时效果了啊~~时间不够,就刚好读不出数据啊~~~   
莫非是我没表述清楚...
我说的只是其中一种情况, 你示波器看看波形就知道了。 

还有可能就是代码放面啦, 不过这个偶就不来分析了..   

[解决办法]
不知楼主是否用的51。

先说错误1,在C语言中可以这样直接用ACC寄存器么,不会和局部变量冲突么,反正我从没这样用过,你的最终版中虽然对了,更多是因为那个函数中后面没有用到ACC的地方吧。建议楼主看看错误1的汇编,看看是否是ACC不对。

至于错误2和错误3,我认为你写错了,应该是
            *p = *p <<1;//本意是对象左移一位,这样写会不会有问题? 
            *p 
[解决办法]
= miso;
   和
           RX_PLD[j] = RX_PLD[j] <<1//这样写呢,有任何问题么? 
             RX_PLD[j] 
[解决办法]
= miso; 


热点排行