📄 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 + -