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

yygy   2009-8-29 16:16 楼主
目前在做一个项目,是基于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_();
        }
}


问题很菜,不要见笑!主要看我写的发送和接收时的时序对不?

回复评论 (13)

左边是高位,右边是低位....
点赞  2009-8-29 16:31
如果发是高位先发,那收只能是高位先收....
点赞  2009-8-29 16:32
软件模拟SPI时序?

网上应该可以找到源码的

bit顺序都是符合SPI协议的
点赞  2009-8-29 16:35
SDATA=COMMD&0x80; // 这是什么意思? 可能不会得到你要的结果的.....

也许这样才行:
if (COMMD&0x80) SDATA = 1;
else SDATA = 0;
点赞  2009-8-29 16:36
1.左边高位,右边低位
2.接收时序应该和发送是反过来的,需要注意的是同步,判断接收端的变化沿。
点赞  2009-8-29 16:39
怎么会是反过来的????
点赞  2009-8-29 17:37
一个字节自然是高位在前,低位在后。
SPI时序是一个clk对应1bit,看楼主的描述,这个SPI模块应当是要求你先发高位再发低位的意思吧。
点赞  2009-9-11 15:59
读书的时候是不是都逃课去泡MM了?
点赞  2009-9-12 13:42
高位地位都不知道!!我晕1!
点赞  2010-4-24 07:38
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

点赞  2010-4-24 09:47
  SPI也就是个时序问题而已。
点赞  2010-4-25 22:55
SPI通信发送是先发高字节再发字节。接收是先收高字节再收低字节。
点赞  2010-4-28 11:29
楼上是对的
点赞  2010-4-29 12:09
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复