SPI收发数据,高低位字节顺序!

yingkundu 2009-08-29 04:16:09
目前在做一个项目,是基于51单片机和SPI模块通讯的。
我的问题是:
1、这个SPI模块要求发送数据时,每个字节必须是高位在前,地位在后。一个字节中哪些位是高位,哪些位是地位?比如一个二进制数据:11110000.如果按照它的要求的话,我应该先发11110000,还是00001111?
2、文档上只说了发送的时候是高位在前,地位在后。那么接收的时候是不是和发送的时序一样?还是接收时候先接受地位,再接收高位?

下面是我写的发送和接收的代码
发送:
void send_RF500_data_Byte(uchar COMMD)//高位在先,低位在后。
{
uchar i,j;
for(i=0;i<8;i++)
{
SDATA=COMMD&0x80;
SCLK=1;
for(j=0;j<10;j++)//大约50us左右
{
_nop_();
_nop_();
}
SCLK=0;
for(j=0;j<10;j++)
{
_nop_();
_nop_();
}
COMMD=COMMD<<1;
}

if(Timer0_times>=5)
{
// make_Err_data(0x60);
}
else
;
SCLK=0;
}


接收:
for(i=0;i<8;i++)
{
SCLK=1;
for(j=0;j<10;j++)
{
_nop_();
_nop_();
}
if(SDATA==1)
temp_data|=0x01;
temp_data<<=1;
SCLK=0;
for(j=0;j<10;j++)
{
_nop_();
_nop_();
}
}


问题很菜,不要见笑!主要看我写的发送和接收时的时序对不?
...全文
4746 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingkb 2010-04-29
  • 打赏
  • 举报
回复
楼上是对的
mj_17 2010-04-28
  • 打赏
  • 举报
回复 3
SPI通信发送是先发高字节再发字节。接收是先收高字节再收低字节。
hallowwar 2010-04-25
  • 打赏
  • 举报
回复
SPI也就是个时序问题而已。
leileipei 2010-04-24
  • 打赏
  • 举报
回复
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

上升沿发送、下降沿接收、高位先发送。

上升沿到来的时候,sdo上的电平将被发送到从设备的寄存器中。

下降沿到来的时候,sdi上的电平将被接收到主设备的寄存器中。

假设主机和从机初始化就绪:并且主机的sbuff=0xaa (10101010),从机的sbuff=0x55 (01010101),下面将分步对spi的8个时钟周期的数据情况演示一遍(假设上升沿发送数据)。

---------------------------------------------------

脉冲 主机sbuff 从机sbuff sdi sdo

---------------------------------------------------

0 00-0 10101010 01010101 0 0

---------------------------------------------------

1 0--1 0101010x 10101011 0 1

1 1--0 01010100 10101011 0 1

---------------------------------------------------

2 0--1 1010100x 01010110 1 0

2 1--0 10101001 01010110 1 0

---------------------------------------------------

3 0--1 0101001x 10101101 0 1

3 1--0 01010010 10101101 0 1

---------------------------------------------------

4 0--1 1010010x 01011010 1 0

4 1--0 10100101 01011010 1 0

---------------------------------------------------

5 0--1 0100101x 10110101 0 1

5 1--0 01001010 10110101 0 1

---------------------------------------------------

6 0--1 1001010x 01101010 1 0

6 1--0 10010101 01101010 1 0

---------------------------------------------------

7 0--1 0010101x 11010101 0 1

7 1--0 00101010 11010101 0 1

---------------------------------------------------

8 0--1 0101010x 10101010 1 0

8 1--0 01010101 10101010 1 0

jiaotao1983 2010-04-24
  • 打赏
  • 举报
回复
高位地位都不知道!!我晕1!
gelu1040 2009-09-12
  • 打赏
  • 举报
回复
读书的时候是不是都逃课去泡MM了?
fengxiasha 2009-09-11
  • 打赏
  • 举报
回复
一个字节自然是高位在前,低位在后。
SPI时序是一个clk对应1bit,看楼主的描述,这个SPI模块应当是要求你先发高位再发低位的意思吧。
Great_Bug 2009-08-29
  • 打赏
  • 举报
回复
怎么会是反过来的????
luotuo512 2009-08-29
  • 打赏
  • 举报
回复
1.左边高位,右边低位
2.接收时序应该和发送是反过来的,需要注意的是同步,判断接收端的变化沿。
Great_Bug 2009-08-29
  • 打赏
  • 举报
回复
SDATA=COMMD&0x80; // 这是什么意思? 可能不会得到你要的结果的.....

也许这样才行:
if (COMMD&0x80) SDATA = 1;
else SDATA = 0;
Arnold9009 2009-08-29
  • 打赏
  • 举报
回复
软件模拟SPI时序?

网上应该可以找到源码的

bit顺序都是符合SPI协议的
Great_Bug 2009-08-29
  • 打赏
  • 举报
回复
如果发是高位先发,那收只能是高位先收....
Great_Bug 2009-08-29
  • 打赏
  • 举报
回复
左边是高位,右边是低位....

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧