模拟SPI程序

合集下载

SPI编程说明

SPI编程说明
2:设定板子参数(打开程序之后回到设备操作,再选择文件选项,把板子厚度那一项修改一下即可,以实际板子厚度为准)。
3:划分FOV(点击创建FOV,然后选择 是 或者 否 即可)。
4:调整原点(点击手动添加,通过控制和调整板子原点,使钢网文件盒板子实际重叠即可。控制移动时调节视野的,调整板子原点才是移动坐标的。)
8:添加拼板(点击开始和结束,选择对应的两个焊盘)
8:添加拼板(选择对应的焊盘点之后,如果需要选择角度的选择角度,之后点击添加即可完成)。
9:编辑基准点(找到基准点,右键点击注册基准点,弹出对话框,点击OK即可完成第一个基准点的注册,再找到另外一个基准点以相同的办法完成即可。如果第二个基准点是粉红色,那就回到选择设定焊盘区域那,再注册一次)。
5:基准点设定(打开编辑基准点,选择基准点列表,双击数字1,即可切换到板子对应的基准点。基准点完成之后,保存基准点也是在这下面)。
5:基准点调节(先把曝光时间设置在3-7之间,点击二值化,再点击拍照,将基准点彻底的与周边颜色区分开来;并保证那个绿色的十字架在MARK点的正中间,以相同的手法,完成另一个基准点的制作,并保存)。
2:当你连续测试几块板子都觉得你这个程序没有问题的话,那么你就到文件选项将这个程序保存;第一次做的时候保存不了,你可以选择点击导出程序。
3:这就是我们的程序制作大概步骤,剩下的一些都是需要自己的摸索的。
10:创建FOV(点击创建,弹出对话框选择是或者否都可以完成FOV的创建)。
11:OK NG(点出OK NG来,然后直接点击生成即可,注意两个都要点击生成的)。
12:程序到此已经做完,剩下的是在SPI软件的调试,所以将做好的程序导出即可。
二:SPI软件调试
1:加载检测程序(打到手动模式,选择文件选项,点击打开程序,选择加载程序,选择所需要打开的程序,双击或者选择再打开。)

SPI单主单从的验证及程序

SPI单主单从的验证及程序

SPI单主单从的验证及程序在主机测量:DORD=1主机CPHA=0,SCLK(CPOL=1),MOSI(输出)主机输出A5、5A;前沿改变,后沿采样;主机CPHA=0,SCLK(CPOL=1),MISO(输入)从机输出F0主机输入;前沿改变,后沿采样(正好对着时钟的跳变处)在从机测量:主机CPHA=0,SCLK(CPOL=1),MOSI(输出)主机输出A5、5A 从机输入;前沿改变,后沿采样主机CPHA=0,SCLK(CPOL=1),MISO(输入)从机输出F0主机输入前沿改变,后沿采样在主机测量:主机CPHA=1,SCLK(CPOL=1),MOSI(输出)主机输出A5、5A;后沿改变,前沿采样主机CPHA=1,SCLK(CPOL=1),MISO(输入)从机输出F0主机输入;后沿改变,前沿采样在从机测量:主机CPHA=1,SCLK(CPOL=1),MOSI(输出)主机输出A5、5A 从机输入;后沿改变,前沿采样主机CPHA=1,SCLK(CPOL=1),MISO(输入)从机输出F0主机输入;后沿改变,前沿采样MISO从机发AA时,SPI的总结:(1)由单主单从的实践中得到的体会。

STC12C5A60S2单片机实验。

实验验证DORD和CPHA的方式与资料所给信息不同。

DORD=1时,数据先发送最高位。

CPHA=0时,前沿改变,后沿采样。

CPHA=1时,前沿采样,后沿改变。

(2)实验程序:主机程序:SPSTAT EQU 0CDH//初始地址SPCTL EQU 0CEHSPDAT EQU 0CFHORG 0000HLJMP MAINORG 0100HMAIN:CLR P1.0 //判断单片机是否在工作状态MOV SPCTL, #0FDH ;如果为主机,SPI初始化控制寄存器,主机数据先发送最高位,前沿采样,后沿改变,频率设置低点,这样好采样。

MOV SPSTAT, #0C0H //状态寄存器复位,写1复位CLR P1.4 //从机选择拉低LOOP:MOV SPDAT,#0CCH ;将要发送的数据给发送寄存器MOV A,SPDATMOV P0,ASPI_WAIT: //判断是否发送完MOV A, SPSTATANL A,#80HJZ SPI_WAITMOV SPSTAT, #0C0H //发完复位NOPNOPNOPNOPNOPNOPMOV SPDAT,#0CCHMOV A,SPDATMOV P2,ASPI_WAIT1:MOV A, SPSTATANL A,#80HJZ SPI_WAIT1MOV SPSTAT, #0C0HNOPNOPNOPNOPNOPNOPLJMP LOOP ;发送完成后,循环开始END从机程序:SPSTAT EQU 0CDHSPCTL EQU 0CEHSPDAT EQU 0CFHORG 0000HLJMP MAINORG 0100HMAIN:CLR P1.0MOV SPCTL,#6DH //从机SSIG设置为0,MSTR为0,其它的和主机一样 MOV SPSTAT, #0C0HSPI_WAIT:MOV A, SPSTATANL A,#80HJZ SPI_WAITMOV SPSTAT, #0C0HMOV A,#0AAHMOV SPDAT,AMOV P0,ALJMP SPI_WAITEND。

51单片机模拟spi串行接口程序

51单片机模拟spi串行接口程序
unsigned char SPI_TransferByte(unsigned char val)
{
unsigned char BitCounter;
for(BitCounter=8; BiCounter!=0; BitCounter--)
{ CLK=0;
DataI=0; // write
if(val&0x80) DataI=1;
val<<=1;
CLK=1;
if(DataO)val|=1; // read
}
CLK=0;
return val;
}
sbit CLK= P1^5;
sbit DataI=P1^7;
sbiபைடு நூலகம் DataO=P1^6;
#define SD_Disable() CS=1 //片选关
#define SD_Enable() CS=0 //片选开
val<<=1;
CLK=1;
if(DataO)val|=1; // read
}
CLK=0;
return val;
}
sbit CLK= P1^5;
sbit DataI=P1^7;
sbit DataO=P1^6;
#define SD_Disable() CS=1 //片选关
#define SD_Enable() CS=0 //片选开
unsigned char SPI_TransferByte(unsigned char val)
{
unsigned char BitCounter;
for(BitCounter=8; BiCounter!=0; BitCounter--)
{ CLK=0;

运用4个普通IO口模拟SPI程序等

运用4个普通IO口模拟SPI程序等
SIG--------- PORTB.0 双项输入 Din--------- PORTB.2 单项输出 Dout-------- PORTB.3 双项输入 SCLK-------- PORTB.4 单项输出 CS---------- PORTB.5 单项输出 SEL--------- PORTB.6 单项输出 RESET------- PORTB.1 单项输出 #define SET1302_RST PORTB|=(1<<7) #define CLR1302_RST PORTB&=~(1<<7) ************************************************************* ************************/ #define ATT_SIG PINB.0 #define ATT_Din PORTB.2 #define ATT_Dout PINB.3 #define ATT_SCLK PORTB.4
运用 4 个普通 I/O 口模拟 SPI 程序源代码
/******************************************************************** 函 数 名:uchar SpiReadWrite(uchar dat) 功 能:SPI 发送接收一个数据 说 明: 调 用: 入口参数: 出口参数: ***********************************************************************/ uchar SpiReadWrite(uchar dat) { uchar i,temp; temp=0; SCK=0; _nop_(); for(i=0;i<8;i++) { if(dat & 0x80) { MOSI=1; }

stc12单片机SPI的nrf24l01程序

stc12单片机SPI的nrf24l01程序

stc12单片机SPI的nrf24l01程序/////////////////////发送/////////////////////////////// #include <reg52.h>#include <intrins.h>typedef unsigned char uchar;#define uint unsigned int//****************************************IO端口定义***************************************sfr SPCTL = 0xCE;//SPI Control Register SSIG SPEN DORD MSTR CPOL CPHASPR1 SPR0 0000,0100sfr SPSTAT = 0xCD;//SPI Status Register SPIF WCOL - - - -- - 00xx,xxxxsfr SPDAT = 0xCF;sbit CE =P1^0;sbit CSN =P1^1;sbit IRQ =P1^2;sbit led=P1^3;//********************************************************* ********************************* uchar bdata sta;//状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;//*********************************************NRF24L01*************************************#define TX_ADR_WIDTH 5// 5 uints TX address width#define RX_ADR_WIDTH 5// 5 uints RX address width#define TX_PLOAD_WIDTH 32// 32 uints TX payload#define RX_PLOAD_WIDTH 32// 32 uints TX payloaduchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//本地地址uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址 uchar codeTx_Buf[TX_PLOAD_WIDTH]={0xff,0xee,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x2 2,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa ,0xbb,0x11,0x22,0x33,0xee,0xff};//发送数据 ucharRx_Buf[RX_PLOAD_WIDTH];//接收数据//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG 0x00 // 读寄存器指令 #defineWRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX0xE1 // 冲洗发送FIFO指令 #define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA 0x01 // 自动应答功能设置 #define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置 #defineSETUP_RETR 0x04 // 自动重发功能设置 #define RF_CH 0x05 // 工作频率设置 #define RF_SETUP 0x06 // 发射速率、功耗功能设置 #define STATUS 0x07 // 状态寄存器 #define OBSERVE_TX 0x08 // 发送监测功能 #defineCD 0x09 // 地址检测 #define RX_ADDR_P0 0x0A // 频道0接收数据地址#defineRX_ADDR_P1 0x0B // 频道1接收数据地址 #defineRX_ADDR_P2 0x0C // 频道2接收数据地址 #defineRX_ADDR_P3 0x0D // 频道3接收数据地址 #defineRX_ADDR_P4 0x0E // 频道4接收数据地址 #defineRX_ADDR_P5 0x0F // 频道5接收数据地址 #define TX_ADDR 0x10 // 发送地址寄存器 #define RX_PW_P0 0x11 // 接收频道0接收数据长度 #define RX_PW_P1 0x12 // 接收频道1接收数据长度 #define RX_PW_P2 0x13 // 接收频道2接收数据长度 #define RX_PW_P3 0x14 // 接收频道3接收数据长度 #define RX_PW_P4 0x15 // 接收频道4接收数据长度 #define RX_PW_P5 0x16 // 接收频道5接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置/******************************************延时函数********************************************************///长延时 void Delay(unsigned int s) { unsigned int i,j;for(i=0;i<1000;i++)for(j=0;j<s;j++); } //短延时 voiddelay_ms(unsigned int x) { unsigned int i,j; i=0;for(i=0;i<x;i++) { j=108; while(j--); } } /************初始化5A spi***************/ void Init_SPI() { SPDAT=0; //初始化数据寄存器 SPSTAT=0XC0; //清除状态寄存器SPCTL=0XD2;//设置为主机模式主频不能超过2M //忽略SS 使能spi MSB SCLK空闲为0 第一个时钟边沿开始采集 spi通信的频率为CUP_CLK/16 } //SPDAT 读写一个字节 //TxData:要写入的字节//返回值:读取到的字节 uchar SPI_ReadWriteByte(uchar TxData){ SPDAT=TxData; //发送一个bytewhile((SPSTAT&0x80)==0); SPSTAT=0XC0; //清除状态寄存器 return SPDAT; //返回收到的数据 } //读取SPI寄存器值 //reg:要读的寄存器 uchar SPI_Read_Reg(uchar reg) { uchar reg_val; CSN = 0; //使能SPI传输SPI_ReadWriteByte(reg); //发送寄存器号reg_val=SPI_ReadWriteByte(0xFF);//读取寄存器内容 CSN = 1;//禁止SPI传输 return(reg_val); //返回状态值 } // 向寄存器REG写一个字节,同时返回状态字节reg寄存器地址 value写入的数据 uchar SPI_RW_Reg (ucharreg,uchar value) { uchar status; CSN=0;status=SPI_ReadWriteByte(reg);//发送寄存器号SPI_ReadWriteByte(value); //写入寄存器的值 CSN=1;return(status); } //写一个数据包 ucharSPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) { ucharstatus,byte_ctr; CSN = 0;status=SPI_ReadWriteByte(reg); for(byte_ctr=0; byte_ctr<bytes;byte_ctr++) SPI_ReadWriteByte(*pBuf++); CSN = 1; return(status); } //读一个数据包 uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) { uchar status,uchar_ctr; CSN = 0;status = SPI_ReadWriteByte(reg);for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_ctr]=SPI_ReadWriteByte(0xFF); CSN = 1; return(status); } /*******************************接 ***** 收 ***** 模 *****式 ***** 代 ***** 码 *************************************//*********************************************************************** *******************************/ /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) /*功能:数据读取后放如rx_buf接收缓冲区中/******************************************************************* ***********************************/ unsigned charnRF24L01_RxPacket(unsigned char* rx_buf) { // unsigned char revale=0; sta=SPI_Read_Reg(STATUS); // 读取状态寄存其来判断数据接收状况 SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 if(RX_DR) // 判断是否接收到数据{ SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferSPI_RW_Reg(FLUSH_RX,0xFF);//清除接受FIFO return 1;//读取数据完成标志 } return 0; }/******************************************************************* *********************************/ /*函数:voidRX_Mode(void) /*功能:数据接收配置/******************************************************************* *********************************/ void RX_Mode(void) { CE=0; //SPI_RW_Reg(FLUSH_RX,0x00);//清除接受FIFO //SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack SPI_RW_Reg(WRITE_REG + EN_AA,0x01);//使能自动应答 Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //连接通道0和地址 Enable Pipe0//SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...1a SPI_RW_Reg(WRITE_REG + RF_CH, 40);//通信频率0~125 设置通信的频率 Select RF channel 40SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节 SPI_RW_Reg(WRITE_REG +RF_SETUP,0X07); //0x07 TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR // 设置TX发射参数,0db增益,2Mbps,低噪声增益开启 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F);//配置基本工作模式的参数 CE=1; delay_ms(130); }//************************************串口初始化********************************************************* void StartUART( void ) { //波特率9600 TMOD=0x20;//设置定模式2 TH1=0xFD; TL1=0xFD; SM1=1; //设置串口SCON,为方式1 SM0=0; REN=1; //串行允许 TR1=1; //启动定时器EA=1; //中断 ES=1; //打开串口 }//************************************通过串口将接收到数据发送给PC端 ************************************** voidR_S_Byte(uint R_Byte) { ES=0; SBUF=R_Byte; while(TI==0); TI=0; ES=1; } /************************************主函数************************************************************/ uchar NRF24L01_Check(void) { ucharbuf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; uchar i;SPI_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.SPI_Read_Buf(TX_ADDR,buf,5); //读出写入的地址for(i=0;i<5;i++) if(buf[i]!=0XA5) break; if(i!=5) return 1;//检测24L01错误 return 0; //检测到24L01 } void main() { uint i=0; CE=0; CSN=1; led=0; Init_SPI(); StartUART(); //串口初始while(NRF24L01_Check())//检测不到24L01 { delay_ms(500);delay_ms(500); R_S_Byte(0x11); } //接收模式代码 RX_Mode(); //接受模式 Delay(10);//防止编译警告 while(1){ if(nRF24L01_RxPacket(Rx_Buf)) { for(i=0;i<TX_PLOAD_WIDTH;i++) { R_S_Byte(Rx_Buf[i]); //发送接收到的数据到电脑 } } Delay(10); } }。

SPI初始化程序

SPI初始化程序

//SPI初始化子程序,用于数码管显示void spi_intial(){SpiaRegs.SPICCR.all =0x0047; // 使SPI处于复位方式, 下降沿, 八位数据SpiaRegs.SPICTL.all =0x0006; //主控模式,般时钟模式,使能talk,闭SPI中断SpiaRegs.SPIBRR =0x007F; //配置波特率SpiaRegs.SPICCR.all =SpiaRegs.SPICCR.all|0x0080; // 退出复位状态EALLOW;GpioMuxRegs.GPFMUX.all=0x000F;// 设置通用引脚为SPI引脚EDIS;}//IO初始化子程序void gpio_init(){EALLOW;GpioMuxRegs.GPAMUX.bit.TDIRA_GPIOA11=0; //GPIOA11设置为一般I/O口GpioMuxRegs.GPADIR.bit.GPIOA11=1; //把GPIOA11设置为输出//将GPIOE0~GPIOE2配置为一般I/O口输出,作138译码GpioMuxRegs.GPEMUX.all = GpioMuxRegs.GPEMUX.all&0xfff8; GpioMuxRegs.GPEDIR.all = GpioMuxRegs.GPEDIR.all|0x0007;//将GPIOB8~GPIOB15配置为一般I/O口,D0~D7GpioMuxRegs.GPBMUX.all = GpioMuxRegs.GPBMUX.all&0x00ff;EDIS;GpioDataRegs.GPADAT.bit.GPIOA11=0; //GPIOA11=0;该端口为74HC595锁存信号}//键扫描子程序K1~K8int Keyscan1(void){EALLOW;//将GPIOB8~GPIOB15配置为输入,D0~D7GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all&0x00ff;EDIS;GpioDataRegs.GPEDAT.all = 0xfff8; //选通KEY低8位for (i=0; i<100; i++){} //延时//判K1~K8是否按下if ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff){for (i=0; i<30000; i++){} //延时消抖if ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff){KeyReg1=GpioDataRegs.GPBDAT.all ; //读键值while ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff) //判K1~K8是否松开{GpioDataRegs.GPDDAT.bit.GPIOD1 = !GpioDataRegs.GPDDAT.bit.GPIOD1;for (i=0; i<1000; i++){}}return (1);}}return (0);}//键扫描子程序K9~K16int Keyscan2(void){EALLOW;//将GPIOB8~GPIOB15配置为输入,D0~D7GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all&0x00ff;EDIS;GpioDataRegs.GPEDAT.all = 0xfff9; //选通KEY高8位for (i=0; i<100; i++){} //延时//判K8~K16是否按下if ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff){for (i=0; i<30000; i++){} //延时消抖if ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff){KeyReg2=GpioDataRegs.GPBDAT.all ; //读键值while ((GpioDataRegs.GPBDAT.all|0x00ff)!=0xffff) //判K8~K16是否松开{GpioDataRegs.GPDDAT.bit.GPIOD1 = !GpioDataRegs.GPDDAT.bit.GPIOD1; for (i=0; i<1000; i++){}}return (1);}}return (0);}//按键记录次数,显示在16个LED上void LedOut(Uint16 led){EALLOW;//将GPIOB8~GPIOB15配置为输出,D0~D7GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xff00;EDIS;GpioDataRegs.GPEDAT.all = 0xfffb; //LEDB选通GpioDataRegs.GPBDAT.all = ~led; //显示高8位for (i=0; i<100; i++){} //延时GpioDataRegs.GPEDAT.all = 0xffff; //锁存高8位GpioDataRegs.GPEDAT.all = 0xfffa; //LEDA选通GpioDataRegs.GPBDAT.all = ~(led<<8); //显示低8位for (i=0; i<100; i++){}GpioDataRegs.GPEDAT.all = 0xffff; //锁存低8位}//键散转子程序K1~K8void KeyFunction1(unsigned int KeyReg1){switch(KeyReg1){case K1: {LEDReg= 0x00; //键号0}break;case K2: {LEDReg= 0x01; //键号1}break;case K3: {LEDReg= 0x02; //键号2}break;case K4: {LEDReg= 0x03; //键号3}break;case K5: {LEDReg= 0x04; //键号4}break;case K6: {LEDReg= 0x05; //键号5}break;case K7: {LEDReg= 0x06; //键号6}break;case K8: {LEDReg= 0x07; //键号7}break;default:break;}}//键散转子程序K9~K16void KeyFunction2(unsigned int KeyReg2) {switch(KeyReg2){case K9: {LEDReg= 0x08; //键号8}break;case K10: {LEDReg= 0x09; //键号9}break;case K11: {LEDReg= 0x0A; //键号A}break;case K12: {LEDReg= 0x0B; //键号B}break;case K13: {LEDReg= 0x0C; //键号C}break;case K14: {LEDReg= 0x0D; //键号D}break;case K15: {LEDReg= 0x0E; //键号E}break;case K16: {LEDReg= 0x0F; //键号F}break;default:break;}}void display (LEDReg) //显示子程序{GpioDataRegs.GPADAT.bit.GPIOA11=0; //给LACK信号一个低电平SpiaRegs.SPITXBUF =LEDCode[LEDReg]; //给数码管送数while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF;GpioDataRegs.GPADAT.bit.GPIOA11=1; //给LACK信号一个高电平为锁存74HC595 for(i=0;i<10;i++){} //延时}void main(void){Uint16 keyNum = 0x0000; //按键次数初始化InitSysCtrl(); // 系统初始化程序,该子程序存放在DSP281x_sysctrl.c中DINT; //关闭总中断spi_intial(); //SPI初始化子程序gpio_init(); // I/O初始化子程序IER = 0x0000; // 关闭外围中断IFR = 0x0000; // 清中断标志LedOut(keyNum); // LED指示灯初始化for(i=0;i<8;i++)// 8个数码管清0{SpiaRegs.SPITXBUF =LEDCode[0]; //给数码管送数while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}SpiaRegs.SPIRXBUF = SpiaRegs.SPIRXBUF;}GpioDataRegs.GPADAT.bit.GPIOA11=1; //给LACK信号一个高电平为锁存74HC595 for(i=0;i<10;i++){}while (1){if (Keyscan1() == 1) // 调用键扫描K1~K8子程序{keyNum=keyNum+1; // 按键记数KeyFunction1(KeyReg1);display (LEDReg); //显示键值LedOut(keyNum); //显示按键次数}if (Keyscan2() == 1) // 调用键扫描K8~K16子程序{keyNum=keyNum+1;KeyFunction2(KeyReg2);display (LEDReg); //显示键值LedOut(keyNum); //显示按键次数}}}。

SPI完整程序

SPI完整程序

SPI接口源程序module simple_spi_top(// 8bit WISHBONE bus slave interfaceinput wire clk_i, // clockinput wire rst_i, // reset (asynchronous active low)input wire cyc_i, // cycleinput wire stb_i, // strobeinput wire [1:0] adr_i, // addressinput wire we_i, // write enableinput wire [7:0] dat_i, // data inputoutput reg [7:0] dat_o, // data outputoutput reg ack_o, // normal bus terminationoutput reg inta_o, // interrupt output// SPI portoutput reg sck_o, // serial clock outputoutput wire mosi_o, // MasterOut SlaveINinput wire miso_i // MasterIn SlaveOut);//// Module body//reg [7:0] spcr; // Serial Peripheral Control Register ('HC11 naming) wire [7:0] spsr; // Serial Peripheral Status register ('HC11 naming)reg [7:0] sper; // Serial Peripheral Extension registerreg [7:0] treg, rreg; // Transmit/Receive register// fifo signalswire [7:0] rfdout;reg wfre, rfwe;wire rfre, rffull, rfempty;wire [7:0] wfdout;wire wfwe, wffull, wfempty;// misc signalswire tirq; // transfer interrupt (selected number of transfers done) wire wfov; // write fifo overrun (writing while fifo full)reg [1:0] state; // statemachine statereg [2:0] bcnt;//// Wishbone interfacewire wb_acc = cyc_i & stb_i; // WISHBONE accesswire wb_wr = wb_acc & we_i; // WISHBONE write access// dat_ialways @(posedge clk_i or negedge rst_i)if (~rst_i)beginspcr <= #1 8'h10; // set master bitsper <= #1 8'h00;endelse if (wb_wr)beginif (adr_i == 2'b00)spcr <= #1 dat_i | 8'h10; // always set master bitif (adr_i == 2'b11)sper <= #1 dat_i;end// write fifoassign wfwe = wb_acc & (adr_i == 2'b10) & ack_o & we_i; assign wfov = wfwe & wffull;// dat_oalways @(posedge clk_i)case(adr_i) // synopsys full_case parallel_case2'b00: dat_o <= #1 spcr;2'b01: dat_o <= #1 spsr;2'b10: dat_o <= #1 rfdout;2'b11: dat_o <= #1 sper;endcase// read fifoassign rfre = wb_acc & (adr_i == 2'b10) & ack_o & ~we_i;// ack_oalways @(posedge clk_i or negedge rst_i)if (~rst_i)ack_o <= #1 1'b0;elseack_o <= #1 wb_acc & !ack_o;// decode Serial Peripheral Control Registerwire spie = spcr[7]; // Interrupt enable bitwire spe = spcr[6]; // System Enable bitwire dwom = spcr[5]; // Port D Wired-OR Mode Bit wire mstr = spcr[4]; // Master Mode Select Bit wire cpol = spcr[3]; // Clock Polarity Bitwire cpha = spcr[2]; // Clock Phase Bitwire [1:0] spr = spcr[1:0]; // Clock Rate Select Bits// decode Serial Peripheral Extension Registerwire [1:0] icnt = sper[7:6]; // interrupt on transfer countwire [1:0] spre = sper[1:0]; // extended clock rate selectwire [3:0] espr = {spre, spr};// generate status registerwire wr_spsr = wb_wr & (adr_i == 2'b01);reg spif;always @(posedge clk_i)if (~spe)spif <= #1 1'b0;elsespif <= #1 (tirq | spif) & ~(wr_spsr & dat_i[7]);reg wcol;always @(posedge clk_i)if (~spe)wcol <= #1 1'b0;elsewcol <= #1 (wfov | wcol) & ~(wr_spsr & dat_i[6]);assign spsr[7] = spif;assign spsr[6] = wcol;assign spsr[5:4] = 2'b00;assign spsr[3] = wffull;assign spsr[2] = wfempty;assign spsr[1] = rffull;assign spsr[0] = rfempty;// generate IRQ output (inta_o)always @(posedge clk_i)inta_o <= #1 spif & spie;//// hookup read/write buffer fifofifo4 #(8)rfifo(.clk ( clk_i ),.rst ( rst_i ),.clr ( ~spe ),.din ( treg ),.we ( rfwe ),.dout ( rfdout ),.re ( rfre ),.full ( rffull ),.empty ( rfempty )),wfifo(.clk ( clk_i ),.rst ( rst_i ),.clr ( ~spe ),.din ( dat_i ),.we ( wfwe ),.dout ( wfdout ),.re ( wfre ),.full ( wffull ),.empty ( wfempty ));//// generate clk dividerreg [11:0] clkcnt;always @(posedge clk_i)if(spe & (|clkcnt & |state))clkcnt <= #1 clkcnt - 11'h1;elsecase (espr) // synopsys full_case parallel_case4'b0000: clkcnt <= #1 12'h0; // 2 -- original M68HC11 coding 4'b0001: clkcnt <= #1 12'h1; // 4 -- original M68HC11 coding 4'b0010: clkcnt <= #1 12'h3; // 16 -- original M68HC11 coding 4'b0011: clkcnt <= #1 12'hf; // 32 -- original M68HC11 coding4'b0100: clkcnt <= #1 12'h1f; // 84'b0101: clkcnt <= #1 12'h7; // 644'b0110: clkcnt <= #1 12'h3f; // 1284'b0111: clkcnt <= #1 12'h7f; // 2564'b1000: clkcnt <= #1 12'hff; // 5124'b1001: clkcnt <= #1 12'h1ff; // 10244'b1010: clkcnt <= #1 12'h3ff; // 20484'b1011: clkcnt <= #1 12'h7ff; // 4096endcase// generate clock enable signalwire ena = ~|clkcnt;// transfer statemachinealways @(posedge clk_i)if (~spe)beginstate <= #1 2'b00; // idlebcnt <= #1 3'h0;treg <= #1 8'h00;wfre <= #1 1'b0;rfwe <= #1 1'b0;sck_o <= #1 1'b0;endelsebeginwfre <= #1 1'b0;rfwe <= #1 1'b0;case (state) //synopsys full_case parallel_case2'b00: // idle statebeginbcnt <= #1 3'h7; // set transfer countertreg <= #1 wfdout; // load transfer registersck_o <= #1 cpol; // set sckif (~wfempty) beginwfre <= #1 1'b1;state <= #1 2'b01;if (cpha) sck_o <= #1 ~sck_o;endend2'b01: // clock-phase2, next dataif (ena) beginsck_o <= #1 ~sck_o;state <= #1 2'b11;end2'b11: // clock phase1if (ena) begintreg <= #1 {treg[6:0], miso_i};bcnt <= #1 bcnt -3'h1;if (~|bcnt) beginstate <= #1 2'b00;sck_o <= #1 cpol;rfwe <= #1 1'b1;end else beginstate <= #1 2'b01;sck_o <= #1 ~sck_o;endend2'b10: state <= #1 2'b00;endcaseendassign mosi_o = treg[7];// count number of transfers (for interrupt generation)reg [1:0] tcnt; // transfer countalways @(posedge clk_i)if (~spe)tcnt <= #1 icnt;else if (rfwe) // rfwe gets asserted when all bits have been transferedif (|tcnt)tcnt <= #1 tcnt - 2'h1;elsetcnt <= #1 icnt;assign tirq = ~|tcnt & rfwe;endmodule******************************************************************************* // 4 entry deep fast fifomodule fifo4(clk, rst, clr, din, we, dout, re, full, empty);parameter dw = 8;input clk, rst;input clr;input [dw:1] din;input we;output [dw:1] dout;input re;output full, empty;reg [dw:1] mem[0:3];reg [1:0] wp;reg [1:0] rp;wire [1:0] wp_p1;wire [1:0] wp_p2;wire [1:0] rp_p1;wire full, empty;reg gb;always @(posedge clk or negedge rst)if(!rst) wp <= #1 2'h0;elseif(clr) wp <= #1 2'h0;elseif(we) wp <= #1 wp_p1;assign wp_p1 = wp + 2'h1;assign wp_p2 = wp + 2'h2;always @(posedge clk or negedge rst)if(!rst) rp <= #1 2'h0;elseif(clr) rp <= #1 2'h0;elseif(re) rp <= #1 rp_p1; assign rp_p1 = rp + 2'h1;// Fifo Outputassign dout = mem[ rp ];// Fifo Inputalways @(posedge clk)if(we) mem[ wp ] <= #1 din;// Statusassign empty = (wp == rp) & !gb;assign full = (wp == rp) & gb;// Guard Bit ...always @(posedge clk)if(!rst) gb <= #1 1'b0;elseif(clr) gb <= #1 1'b0;elseif((wp_p1 == rp) & we) gb <= #1 1'b1;elseif(re) gb <= #1 1'b0; endmodule。

STC单片机SPI功能程序

STC单片机SPI功能程序
#include "reg51 .h"
#define FOSC 18432000L
#define BAUD (256 - FOSC / 32 / 115200)
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
sfr AUXR = 0x8e; //Auxiliary register
sfr SPSTAT = 0x84; //SPI status register
#define SPIF 0x80 //SPSTAT.7
SPDAT = SPDAT; //mov data from receive buffer to send buffer
}
}
}
///////////////////////////////////////////////////////////
void InitSPI()
{
SPDAT = 0; //initial SPI data
SPSTAT = SPIF | WCOL; //clear SPI status
SPCTL = SPEN; //slave mode
SPSTAT = SPIF | WCOL; //clear SPI status
SPISS =1 ; //push high slave SS
return SPDAT; //return received SPI data
sfr SPDAT = 0x86; //SPI data register
sbit SPISS = P1^3; //SPI slave select, connect to slave' SS(P .4) pin
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

写程序:voidSPIx_WriteByte(u8 TxData){u8 j=0;SPI_FLASH_CLK_LOW(); //clk=0if(TxData&0x80){SPI_FLASH_DI_HIGH();} //mosi=1else{SPI_FLASH_DI_LOW();} //mosi=0for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); //clk=1,一个上升沿写入一位for(j=0;j<5;j++); //延时SPI_FLASH_CLK_LOW(); //clk=0if(TxData & 0x40){SPI_FLASH_DI_HIGH();} //mosi=1else{SPI_FLASH_DI_LOW();} //mosi=0for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH();for(j=0;j<5;j++);SPI_FLASH_CLK_LOW();if(TxData&0x20){SPI_FLASH_DI_HIGH();} //mosi=1else{SPI_FLASH_DI_LOW();} //mosi=0for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH();for(j=0;j<5;j++);SPI_FLASH_CLK_LOW();if(TxData&0x10){SPI_FLASH_DI_HIGH();} //mosi=1else{SPI_FLASH_DI_LOW();} //mosi=0for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH();for(j=0;j<5;j++);SPI_FLASH_CLK_LOW();if(TxData&0x08){SPI_FLASH_DI_HIGH();} //mosi=1else{SPI_FLASH_DI_LOW();} //mosi=0for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH();for(j=0;j<5;j++);SPI_FLASH_CLK_LOW();if(TxData&0x04){SPI_FLASH_DI_HIGH();} //mosi=1 else{SPI_FLASH_DI_LOW();} //mosi=0for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH();for(j=0;j<5;j++);SPI_FLASH_CLK_LOW();if(TxData&0x02){SPI_FLASH_DI_HIGH();} //mosi=1 else{SPI_FLASH_DI_LOW();} //mosi=0for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH();for(j=0;j<5;j++);SPI_FLASH_CLK_LOW(); //clk=0if(TxData&0x01){SPI_FLASH_DI_HIGH();}else{SPI_FLASH_DI_LOW();}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); //clk=1for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW(); //clk=0}读程序0x80==0x80u8 SPIx_ReadByte(void){u8i=0,j=0;for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); //clk=1if(GPIOC->IDR&0x80==0x80){i=i+0x80;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW(); //clk=0,下降沿读数for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x80==0x80){i=i+0x40;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x80==0x80){i=i+0x20;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x80==0x80){i=i+0x10;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x80==0x80){i=i+0x08;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x80==0x80){i=i+0x04;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x80==0x80){i=i+0x02;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x80==0x80){i=i+0x01;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();returni;}读程序0x40==0x40u8 SPIx_ReadByte(void){u8i=0,j=0;for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); //clk=1if(GPIOC->IDR&0x40==0x40){i=i+0x80;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW(); //clk=0,下降沿读数for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x40==0x40){i=i+0x40;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x40==0x40){i=i+0x20;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x40==0x40){i=i+0x10;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x40==0x40){i=i+0x08;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x40==0x40){i=i+0x04;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x40==0x40){i=i+0x02;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x40==0x40){i=i+0x01;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();returni;}读程序0x20==0x20u8 SPIx_ReadByte(void){u8i=0,j=0;for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); //clk=1if(GPIOC->IDR&0x20==0x20){i=i+0x80;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW(); //clk=0,下降沿读数for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x20==0x20){i=i+0x40;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x20==0x20){i=i+0x20;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x20==0x20){i=i+0x10;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x20==0x20){i=i+0x08;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x20==0x20){i=i+0x04;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x20==0x20){i=i+0x02;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x20==0x20){i=i+0x01;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();returni;}读程序0x10==0x10读程序0x08==0x08读程序0x04==0x04读程序0x02==0x02u8 SPIx_ReadByte(void){u8i=0,j=0;for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); //clk=1if(GPIOC->IDR&0x02==0x02){i=i+0x80;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW(); //clk=0,下降沿读数for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x02==0x02){i=i+0x40;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x02==0x02){i=i+0x20;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x02==0x02){i=i+0x10;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x02==0x02){i=i+0x08;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x02==0x02){i=i+0x04;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x02==0x02){i=i+0x02;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x02==0x02){i=i+0x01;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();returni;}读程序0x01==0x01u8 SPIx_ReadByte(void){u8i=0,j=0;for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); //clk=1if(GPIOC->IDR&0x01==0x01){i=i+0x80;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW(); //clk=0,下降沿读数for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x01==0x01){i=i+0x40;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x01==0x01){i=i+0x20;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x01==0x01){i=i+0x10;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x01==0x01){i=i+0x08;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x01==0x01){i=i+0x04;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x01==0x01){i=i+0x02;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW();for(j=0;j<5;j++);SPI_FLASH_CLK_HIGH();if(GPIOC->IDR&0x01==0x01){i=i+0x01;}for(j=0;j<3;j++); //延时SPI_FLASH_CLK_LOW(); returni;}。

相关文档
最新文档