📄 spi8831.c
字号:
///////////////////////////////////////////////////////////////////////
///SPI驱动8831程序
//采用单端方式输出
//输出公式见数据手册
///////////////////////////////////////////////
#include <c8051f020.h>
#include <intrins.h>
#include <math.h>
# define Vref 2.78
typedef unsigned char uchar;
typedef unsigned int uint;
sbit cs=P0^4;
void Reset_Sources_Init()
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}
void Port_IO_Init()
{
// P0.0 - SCK (SPI0), Open-Drain, Digital
// P0.1 - MISO (SPI0), Open-Drain, Digital
// P0.2 - MOSI (SPI0), Open-Drain, Digital
// P0.3 - NSS (SPI0), Open-Drain, Digital
XBR0 = 0x02;
XBR2 = 0x40;
}
void Oscillator_Init()
{
int i = 0;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x08;
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
Reset_Sources_Init();
Port_IO_Init();
Oscillator_Init();
}
//SPI配置函数具体配置待定
void spi_cfg(uchar spicfg, uchar spickr, uchar spicn)
{
SPI0CFG = spicfg;
SPI0CKR = spickr;
SPI0CN = spicn;
EIE1 &= ~0x01; //禁止中断
}
void SendSPIByte(uint dat)
{
cs=1;
cs=0;
SPIF=0;
SPI0DAT=dat>>8;//发送高8bit
while(!SPIF);
SPIF=0;//清空标志位
SPI0DAT=dat;//发送低8bit
while(!SPIF);
cs=1;//发完了片选拉高,然后在一个时钟周期内 dac装载数据
_nop_();
_nop_();
}
main()
{
uint DACdat;
unsigned char a;
Init_Device();
spi_cfg(0x07,0x0a,0x03);
/*
SPI0CFG = 0x07; 8831cfg=00000111主机模式空闲时候时钟为低when driver 8831 ,ckpol=0;ckpha=0;
SPI0CKR =0X6E ; 8831ckr=0x6e 波特率设置,系统时钟为22.1184MHZ,若果要SCK为100KHZ
SPI0CN = 0x02; 8831cn= 0x02
四线制单主机模式,主机NSS输出为0,SPIEN为0,SPI未开启
注意:这些配制只是暂时的具体待定
*/
while(1)
{//产生正弦波的试验
for(a=1;a<32;a++)
{
DACdat=32768*(1+sin((6.28/32)*a))/Vref;
SendSPIByte(DACdat);//
}
a=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -