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

📄 main.c

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


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


unsigned char StaFlag;
unsigned char SPI_rx_buff[SIZE];
unsigned char SPI_tx_buff[SIZE];
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------

void main (void) 
{
	
	unsigned char i = 0;	

	//-----------------
	// 初始化
    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 (SPIF)
		{			
			SPIF = 0;
			if (SPI0DAT == 40)
			{
				StaFlag = 1;	// 开始通信
			}

			if (StaFlag)
			{
				SPI_rx_buff[i] = SPI0DAT;
				SBUF1 = SPI0DAT;
				i++;

				if (i == SIZE)
				{
					StaFlag = 0;	// 结束通信
					i = 0;
				}
			}
			else
			{
				i = 0;
			}
		}
		
		if (!SLVSEL)
		{
			SPI0DAT = SPI_tx_buff[i];
			P7 ^= 0x01;
		}

		if (WCOL)
		{
			WCOL = 0;
		}
	}
}

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

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

}


// 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;               // XBR0.2允许UART0 在P0.0 (TX0)P0.1 (RX1)
                                    // XBR0.1允许SPI在P0.2 (SCK),P0.3 (MISO),P0.4 (MOSI)P0.5 (NSS)  
                                    // XBR0.0允许I2C在P0.6 (SDA),P0.7 (SCL)                             
    XBR1     = 0x14;               // 允许/INT0在P1.2/INT1在P1.3    
    XBR2     = 0x44;               // 交叉开关使能 允许UART0 在P1.0 (TX0)P1.1 (RX1)
	
	P0MDOUT  = 0xC9;               // 使能 TX0, MISO为推挽输出 
	P1MDOUT  = 0x01;			   // 使能 TX1为推挽方式
	P74OUT   = 0xC0;               // 允许P7为推挽方式

//	P0       |= 0x34;               // 允许SPI的三个管脚为数字输入
}


// SPIO初始化
void SPI0_Init (void)
{
    SPI0CFG =   0x07;                   // 空闲时为低电平,在第一个上升沿采样数据;8-bit数据传输
//    SPI0CFG |=  0xC0;                   // 空闲时为高电平,在第二个上升沿采样数据
    SPI0CN  =   0x01;                   // 主模式; 使能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 + -