?? 33xspi.c
字號:
//-----------------------------------------------------------------------------
// 版權歸新華龍電子公司所有
//-----------------------------------------------------------------------------
//
// 文件名:330SPI.C
//
// 編寫人:寧太陽
//
// 編寫時間:2004/12/30
//
// 目標器件: C8051F33x
//
// 編譯工具: Silicon Laboratories IDE
//
// 程序描述:
//
// 這個程序可以在C8051F33x目標板上使用,與C8051F31x目標板進行全雙工SPI通信,工作在主方式,
// 可對對方進行讀寫操作,在讀數據時LED燈將閃爍,通訊速率為140k,可以在名為slavedata的數組中觀
//察從從機讀過來的數據,正確的數據應是在255-0 之間依次循環。
//-------------下面是C805F330目標板與C8051F310目標板的接圖--------------------
// | C8051330 C8051F310 |
// | |
// | +3VD +3VD |
// | GND GND |
// | P0.0 P0.0 |
// | P0.1 P0.1 |
// | P0.2 P0.4 |
// | P0.3 P0.5 |
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 頭文件包含
//-----------------------------------------------------------------------------
#include <c8051f330.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// 常量定義
//-----------------------------------------------------------------------------
//
#define SYSCLK 24500000 / 8 //系統工作頻率
//
//-----------------------------------------------------------------------------
//位定義
//-----------------------------------------------------------------------------
sbit LED = P1^3; // LED所接的引腳
sbit CS = P0^3; // 從機片選
//-----------------------------------------------------------------------------
//全局變量定義
//-----------------------------------------------------------------------------
unsigned char xdata slavedata[300]; // 存放收到的數據
unsigned char *spipoint; //masterdata數組的指針
//-----------------------------------------------------------------------------
// 函數定義
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void SPI_Init(void);
void SPI_Write(unsigned char SPIBuffer);
void DELAY(unsigned int t);
void SPI_ReadByte(void);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
{
unsigned int i,j;
PCA0MD &= ~0x40; //禁止看門狗定時器
SYSCLK_Init (); // 系統時鐘初始化
PORT_Init (); // 交叉開關和通用I/O口初始化
SPI_Init(); //SPI初始化
EA = 1; // 總中斷使能
spipoint = &slavedata;
while (1)
{
for(i=0;i<=20000;i++);
CS=0;
SPI_Write(j);
SPI_ReadByte();
j++;
CS=1;
}
}
//-----------------------------------------------------------------------------
//系統時鐘初始化
//-----------------------------------------------------------------------------
//
void SYSCLK_Init (void)
{
OSCICN = 0x80; // 系統時鐘初始化為片內的 24.5MHz / 8
RSTSRC = 0x04; // 使能時鐘丟失檢測器
}
//-----------------------------------------------------------------------------
//I/O口及交叉開關初始化
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x02; // SPI分配到P0口
XBR1 = 0x40; // 使能交叉開關和弱上拉
P0MDOUT |= 0x19;
P1MDOUT |= 0x08; // P1.3設為推挽方式
}
//-----------------------------------------------------------------------------
//SPI初始化
//-----------------------------------------------------------------------------
void SPI_Init(void)
{
SPI0CFG = 0x40; //設此器件為主器件
SPI0CN = 0x01; //使能SPI,設為三線主方式
SPI0CKR = 0x10; //速率為140K
}
//-----------------------------------------------------------------------------
//SPI寫數據
//-----------------------------------------------------------------------------
void SPI_Write(unsigned char SPIBuffer)
{
DELAY(50);
SPIF = 0;
SPI0DAT = SPIBuffer;
while(SPIF==0);1
SPIF=0;
}
//-------------------------------------------------------------------------
//SPI讀數據
//-----------------------------------------------------------------------------
void SPI_ReadByte(void)
{
DELAY(80);
LED=!LED;
SPIF = 0;
while(SPIF==1); //數據是否接收完畢
SPIF=0;
*spipoint=SPI0DAT; //數據保存到slavedata數組中
spipoint++;
}
//-----------------------------------------------------------------------------
//延時子程序
//-----------------------------------------------------------------------------
void DELAY(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
{
_nop_();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -