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

📄 main.c

📁 针对Silicon labs的C8051F020 mcu 的全双工SPI调试主器件部分程序,对其接收到的从器件(也是F020mcu)的数据包会从串口1中发送至PC,从串口助手中可以看到.开发环境为Ke
💻 C
字号:
//******************************************
//Sue & 20071117
//******************************************

#include	"c8051F020.h"
#include 	"main.h"
#include    "intrins.h"


//unsigned char SPI_rx_buff[SIZE]; 
unsigned char SPI_tx_buff[SIZE]; 
extern unsigned char ucRecData, flag = 0x00;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------

void main (void) 
{
	unsigned int i;

	//-----------------
	// 初始化
    WDTCN = 0xde;
    WDTCN = 0xad; 								// 关看门狗
	EA = 0;

	Oscillator_Init();
    Port_IO_Init();
    SPI0_Init();
    Timer0_Init(); 
	UART1_Init ();
	tx_buffer_Init();

	EA = 1;

    while (1)
	{
//		if (flag == 0x01)
//		{
			for (i=0; i<SIZE; i++)				// 发数据包
				SendSPIData(SPI_tx_buff[i]);
//		}
//		else
//		{
//			SendSPIData(SPI_tx_buff[0]);			
//		}
		Delay1ms(1000);
	}

}


void SendSPIData(unsigned char SPIData)
{
	P27 = 0;
	Delay1us (50);	  
	SPI0DAT = SPIData;
	while (SPIF == 0);
	if (SPIF)
	{
		SPIF = 0;
   	}
	Delay1us (50);	  	
	P27 = 1;
	Delay1ms(2);
	SBUF1 = SPI0DAT;
} 

void tx_buffer_Init (void)
{
	unsigned int i;
	SPI_tx_buff[0] = 0x40;

	for (i=1; i<SIZE; i++)
	{
		SPI_tx_buff[i] = i;
	}

}

// This routine initializes the system clock to use an 22.1184MHz crystal as its clock source.
void Oscillator_Init (void)
{
	int i;                              // delay counter
    OSCXCN = 0x67;                      // start external oscillator with 22.1184MHz crystal
	for (i=0; i < 3000; i++);           // XTLVLD blanking interval (>1ms)
	while ((OSCXCN & 0x80) == 0);       // Wait for crystal osc. to settle

	OSCICN = 0x88;                      // select external oscillator as SYSCLK source
	                                    // and enable missing clock detector
}


// 配置数据交叉开关和通用I/O口
void Port_IO_Init(void)
{
    
    XBR0      = 0x07;               // 允许UART0 在P0.0 (TX0)P0.1 (RX1)
                                    // 允许SPI在P0.2 (SCK),P0.3 (MIMO),P0.4 (MOSI)P0.5 (NSS)                                                                   
    XBR1      = 0x14;               // 允许/INT0在P1.2/INT1在P1.3    
    XBR2      = 0x44;               // 交叉开关使能
	
	P2MDOUT   = 0xFF;
	P0MDOUT  |= 0x35;               // 使能 TX0, MOSI, SCK, NSS为推挽输出 
	P1MDOUT  = 0x01;			    // 使能 TX1为推挽方式
	P74OUT    = 0xC0;               // 允许P7为推挽方式
}


// SPIO初始化
void SPI0_Init (void)
{
    SPI0CFG =   0x07;                   // 空闲时为低电平,在第一个上升沿采样数据;8-bit数据传输
//    SPI0CFG |=  0xC0;                   // 空闲时为高电平,在第二个上升沿采样数据
    SPI0CN  =   0x03;                   // 主模式; 使能SPI; 清中断标志
    SPI0CKR =   SYSCLK/2/SPICLK-1;      // SPI时钟 <= 8MHz (limited by EEPROM spec.)
    EIE1    = 	0x01;   				// 开SPI中断  
	EIP1    = 	0x01;   				// SPI中断设高优先级            

}
// Timer0初始化
void Timer0_Init (void)
{

    CKCON   |= 0x78;                    // 使用系统时钟SYSCLK为时钟
    TMOD    |= 0x01;                    // 16Bit Timer
    TR0     = 0;                        // STOP Timer0
    TH0     = (0x00-SYSCLK/1000) >> 8;  // set Timer0 to overflow in 1ms
    TL0     = (0x00-SYSCLK/1000);
    TR0     = 1;                        // START Timer0
    ET0     = 1;                        // 开定时器0中断 

}

// UART1初始化
// 设置UART1, 用定时器1为波特率发生器
// 波特率为9600,用于PC通信
void UART1_Init (void)
{
    CKCON |= 0x10;                  // 选用SYSCLK作为分频时钟      
    TMOD  |= 0x20;                  // T1自动重载方式
    PCON  |= 0x10;                  // SMOD1 = 1,波特率加倍
    
    SCON1 = 0x50;                   // SCON1: 模式1, 8位UART, 允许RX
    TH1   = -(SYSCLK/BAUDRATE1/16); // 按波特率设置定时器1重装值
    TL1   = -(SYSCLK/BAUDRATE1/16);
    		   
    TR1   = 1;                      // 起动定时器1
//	EIP2 |= 0x40;					// 设置UART1为高优先级
    EIE2 |= 0x40;                   // 允许UART1中断
}

⌨️ 快捷键说明

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