SPI通信裸机源代码

SPI主模式源文件

/****************************************************************************
SPI模式通信
SPI主模式:
当寄存器 UxBUF 写入字节后,SPI 主模式字节传送就开始了。USART 使用波特率发生器生
成 SCK 串行时钟,而且传送发送寄存器提供的字节到输出引脚 MOSI。与此同时,接收寄
存器从输入引脚 MISO 获取收到的字节。

SPI从模式:(上升沿还是下降沿触发可编程控制)
SSN 的下降沿,SPI 从模式活跃,在 MOSI 输入上接收数据,在 MOSI 输出上输出数据。
SSN 的上升沿,SPI 从模式不活跃,不接收数据。
****************************************************************************/
#include 
#include "hal_cc8051.h"

#define LED1          P1_0

unsigned char temp = 0;  // 数据收发缓存

void SPI_Master_Init()
{
    CLKCONCMD = 0x80; while (CLKCONSTA != 0x80);      // 系统时钟配置为32MHz
    
    // SPI主机模式配置
    PERCFG |= 0x02;               // 使用USART1的I/O的备用位置2
                                  // P1_4: SSN, P1_5: SCK, P1_6: MOSI, P1_7: MISO 
    P1SEL |= 0xE0;                // 配置P1_5、P1_6、P1_7为外设功能   
    P1SEL &= ~0x10;               // 配置P1_4为通用I/O口(SSN)
    P1DIR |= 0x10;                // 配置SSN引脚为输出引脚
    U1BAUD = 0x00; U1GCR |= 0x11; // 配置波特率4MHz
    U1CSR &= ~0xA0;               // 配置为SPI模式且为SPI主机
    U1GCR &= ~0xC0;               //空闲时SCLK处于低电平、上升沿数据接受、下降沿数据发送
    U1GCR |= 0x20;                // MSB(高字节)先传送
}

void SPI_Master_Receive()
{
    P1_4 = 0;              // SSN下降沿,SPI从机活跃,开始收发数据
    U1DBUF = 0x33;         // 向数据缓存寄存器发送数据
    while(!(U1CSR&0x02));  // 等待数据传送完成,即发送完成标志位置1
    U1CSR &= 0xFD;         // 清除发送完成标志位,即发送完成标志位置0
    temp = U1DBUF;         // 从数据缓存寄存器接受数据
    P1_4 = 1;              // SSN上升沿,SPI从机不活跃,不接收数据
}


void P1_Init()
{
    P1DIR |= 0x01;
    LED1 = 0;
}

void main()
{
    SPI_Master_Init();
    P1_Init();
    
    for(;;) 
    {
      SPI_Master_Receive();
      
      if( temp == 0x11 )
      {
        LED1 = 1;
      }
      else
        LED1 = 0;
      
      halMcuWaitMs(300);
    }
    
}

从模式源文件

#include 

#define LED2          P1_1

unsigned char temp=0;   // 数据接受缓存

void SPI_Slave_Init()
{
    CLKCONCMD = 0x80; while(CLKCONSTA != 0x80);  // 系统时钟配置为32MHz     
    
    // SPI从机模式配置
    PERCFG |= 0x02;                // 使用USART1的I/O的备用位置2
                                   // P1_4: SSN、P1_5: SCK、P1_6: MOSI、P1_7: MISO
    P1SEL |= 0xF0;                 // 配置P1_4、P1_5、P1_6、P1_7为外设功能
    U1BAUD = 0x00; U1GCR |= 0x11;  // 配置波特率4MHz
    U1CSR &= ~0x80; U1CSR |= 0x20; // 配置为SPI模式且为SPI从机
    U1GCR &= ~0xC0;                //空闲时SCLK处于低电平、上升沿数据接受、下降沿数据发送
    U1GCR |= 0x20;                 // MSB(高字节)先传送
}

void SPI_Slave_Receive()
{
    while (!(U1CSR&0x04)); // 等待数据接受完成,即接受完成标志置1
    U1CSR &= 0xFB;         // 清除接受完成标志,即接受完成标志置0
    temp = U1DBUF;         // 从数据缓存寄存器读取数据
}

void P1_Init()
{
    P1DIR |= 0x02;
    LED2 = 0;
}

void main()
{
    P1_Init();
    SPI_Slave_Init();
    
    for(;;) 
    {
      U1DBUF = 0x11;
      SPI_Slave_Receive();
      if( temp == 0x33 )
      {
        LED2 = 1;
      }
      else
        LED2 = 0;
    }
}


你可能感兴趣的:(通信协议)