⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2113_spi.txt

📁 用2210和2131通过SPI接口进行通信
💻 TXT
字号:
我在用2210和2131通过SPI接口进行通信,2210做主机发送数据,2131用中断形式接收数据,但是2210发送的数据始终无法触发2131的中断,进而无法接受数据,哪位达人能给小第指点一下,两块板子间的连线应该怎么连,急,在此跪谢拉:

2131板上程序:
#include "config.h"

#define   SALVE       (1 << 29)
#define   LED          0xff << 16

volatile uint8     RcvData;                // 接收到的数据
volatile uint8     RcvFlag;

void  DelayNS(uint32  dly)
{  
    uint32  i;

    for(; dly>0; dly--) 
        for(i=0; i<50000; i++);
}

void __irq SPI_IRQ(void)
{
    uint32 tmp;
    
    tmp = SPSR;                            // SPI读取数据寄存器之前,必须先读SPSR寄存器,清零SPIF位。
    RcvData = SPDR;                        // 接收数据
    RcvFlag = 0x01;                        // 接收到新数据
    SPINT  = 0x01;                         // 清除标志位
    
    VICVectAddr = 0x00;
} 


void  SPI_Init(void)
{  
    S0PCR  = (0 << 3)|                // CPHA = 0, 数据在SCK 的第一个时钟沿采样
             (1 << 4) |                // CPOL = 1, SCK 为低有效
             (0 << 5) |                // MSTR = 0, SPI 处于从模式
             (0 << 6) |                // LSBF = 0, SPI 数据传输MSB (位7)在先
             (1 << 7);                // SPIE = 1, SPI 中断被使能
}




int main (void)
{  
    uint8  rcv_data; 
    //  uint8  i; 
    
    PINSEL0 = (PINSEL0 | 0x00005500);                        // 设置SPI0管脚连接
         
    PINSEL2 = PINSEL2 & (~0x08);                // P1[25:16]连接GPIO
    IO1DIR  = LED;    
    IO0DIR  = SALVE;                            // 从机片选
    IOCLR   = SALVE;
    

    IRQEnable();                                // IRQ中断使能
    
    SPI_Init();                                    // 初始化SPI接口
    //  SSP_Init();                             // 初始化SSP接口
    
    VICIntSelect = 0x00000000;                  // 设置所有中断为IRQ
    VICVectCntl0 = (0x20 | 10);                 // SPI中断为最高优先级
    VICVectAddr0 = (int32)SPI_IRQ;                // 设置中断向量地址
    VICIntEnable = (1 << 10);                   // 允许SPI中断
    //  IO1SET = LED;    
    
    while(1)    
    {  
        
         if(RcvFlag != 0)                    // 如果接收到新数据
            {
                rcv_data = RcvData;            //对应的LED闪烁
                IO1CLR = rcv_data <<16 ;
             DelayNS(200); 
             IO1SET = rcv_data <<16 ;
             DelayNS(200);
            }
           
     }
    
    return 0;
}

2210板上程序:
#include  "config.h" 

#define   HC595_CS       (1 << 29)      // P0.29口为74HC595的片选

/********************************************************************************************************
** 函数名称:DelayNS()
** 函数功能:长软件延时
** 入口参数:dly        延时参数,值越大,延时越久
** 出口参数:无
********************************************************************************************************/
void  DelayNS(uint32  dly)
{  
    uint32  i;

    for(; dly>0; dly--) 
        for(i=0; i<50000; i++);
}


/********************************************************************************************************
** 函数名称:MSPI_Init()
** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void  MSPI_Init(void)
{  
    //PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;    // 设置管脚连接SPI
    PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
    SPCCR = 0x52;                    // 设置SPI时钟分频
     SPCR  = (0 << 3) |                // CPHA = 0, 数据在SCK 的第一个时钟沿采样
             (1 << 4) |                // CPOL = 1, SCK 为低有效
             (1 << 5) |                // MSTR = 1, SPI 处于主模式
             (0 << 6) |                // LSBF = 0, SPI 数据传输MSB (位7)在先
             (0 << 7);                // SPIE = 0, SPI 中断被禁止
}

/********************************************************************************************************
** 函数名称:MSPI_SendData()
** 函数功能:向SPI总线发送数据。
** 入口参数:data   待发送的数据
** 出口参数:返回值为读取的数据
********************************************************************************************************/
uint8  MSPI_SendData(uint8 data)
{  
    
    IOCLR = HC595_CS;
    SPI_SPDR = data;
    while( 0 == (SPI_SPSR & 0x80));        // 等待SPIF置位,即等待数据发送完毕
   
    IOSET = HC595_CS;
    return(SPI_SPDR);
}


//uint8 const DISP_TAB[8] = {1,2,3,4,5,6,7,8,9};





    uint8  rcv_data; 
int main (void)
{  
    uint8  i; 
    
    PINSEL0 = 0x00005500;                            // 设置SPI管脚连接
    PINSEL1 = 0x00000000;
    IODIR = HC595_CS;
   
    MSPI_Init();                                    // 初始化SPI接口
    while(1)    
    {  
        
       for(i=0; i<8; i++)
        {
           rcv_data = MSPI_SendData(DISP_TAB[i]);    // 发送数据
         DelayNS(80);                            // 延时
       }
      
    }

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -