打印
[技术问答]

关于SPI例程的问题

[复制链接]
1562|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hk386|  楼主 | 2018-3-27 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看N76E003里的SPI中断,看程序中,主机跟从机通讯,有点东西不太理解:
主机
void Start_Sending_SPI(UINT8 *pu8MID,UINT8 *pu8DID)
{         //SS默认是高,开始传送由高到低,所以,进入这个函数,先把SS拉低,完全接受后拉高
    SS = 0;

    SPDR = 0x90;                                // Send 0x90 to Slave ,发
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x4E)                            // Receive slave 1st DATA ,读
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);
                                          
    SPDR = 0x01;                                // Send 0x01 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x55)                            // Receive slave 2nd DATA  
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x02;                                // Send 0x02 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x56)                            // Receive slave 3rd DATA
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x03;                                // Send 0x03 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x4F)                            // Receive slave 4th DATA
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x04;                                // Send 0x04 to Slave
    PCON |= SET_BIT0;                           // Enter idle mode
    if(SPDR != 0x54)                            // Receive slave 5th DATA
       SPI_Error();
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x4F;                  
    PCON |= SET_BIT0;                           // Enter idle mode
    *pu8MID = SPDR;                             // Receive Slave 1st DATA fron Slave      
    printf ("\nSlave Return %c!\n",SPDR);

    SPDR = 0x4E;                  
    PCON |= SET_BIT0;                           // Enter idle mode            
    *pu8DID = SPDR;                             // Receive Slave 2nd DATA from Slave
    printf ("\nSlave Return %c!\n",SPDR);

    SS = 1;   
}其中,后面的解析,前面接从机1-5号数据,和后面的从从机接从机1-2号数据,这个有什么区别吗,还是说我理解有误
沙发
小灵通2018| | 2018-3-27 11:23 | 只看该作者
没区别,你可以理解为前面是测试的握手信息,后面两个是发送什么接收什么的测试。就这样,前面五个是发送一个数据返回另外一个,而且判断,完成了这五个后面用两个数据测试发送什么接收什么。

使用特权

评论回复
板凳
小灵通2018| | 2018-3-27 11:24 | 只看该作者
主机的代码和从机代码你放一起对比着看,你就容易看出来了。

使用特权

评论回复
地板
hk386|  楼主 | 2018-3-28 16:58 | 只看该作者
小灵通2018 发表于 2018-3-27 11:24
主机的代码和从机代码你放一起对比着看,你就容易看出来了。

void Slave_Receive_Data(void)
{
    SPDR = 0x4E;  //发给主机数据送到移位寄存器                          
    PCON |= SET_BIT0;                           // Enter idle mode
    if(u8Receive_Data[0] != 0x90)               // Receive 1st DATA form master  ,读取        缓存区的数据
        SPI_Error();
         
    SPDR = 0x55;
    PCON |= SET_BIT0;                           // Enter idle mode                       
    if(u8Receive_Data[1] != 0x01)               // Receive 2nd DATA form master
        SPI_Error();

    SPDR = 0x56;
    PCON |= SET_BIT0;                           // Enter idle mode
    if(u8Receive_Data[2] != 0x02)               // Receive 3rd DATA form master
        SPI_Error();

    SPDR = 0x4F;
    PCON |= SET_BIT0;                           // Enter idle mode
    if(u8Receive_Data[3] != 0x03)               // Receive 4th DATA form master
        SPI_Error();

    SPDR = 0x54;
    PCON |= SET_BIT0;                           // Enter idle mode
    if(u8Receive_Data[4] != 0x04)               // Receive 5th DATA form master
        SPI_Error();
}
//-----------------------------------------------------------------------------------------------------------
void Slave_Transmit_Data(void)
{
    SPI_Send_Flag = 1;
    SPDR = 0x4F;                                // Send 1st data (04F) to Master
    PCON |= SET_BIT0;                           // Enter idle mode      

    SPI_Send_Flag = 1;
    SPDR = 0x4E;                                // Send 2nd data (0x4E) to Master
    PCON |= SET_BIT0;                           // Enter idle mode
}
这个是主机的,它还把发那2个指针数据还用一个函数,为什么要这么做,这样不是多余的吗???

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

629

帖子

0

粉丝