本帖最后由 电子write_cai 于 2011-8-15 00:42 编辑
- #include "NUC1xx.h"
- #include "DRVGPIO.h"
- #include "DRVSYS.h"
- #include "DRVSPI.h"
- volatile uint8_t Receive_Data;
- volatile SPI_T SPI_Contrl;
- volatile SYSCLK_T CLK_SPI;
- void InitSYS()
- {
- UNLOCKREG(x);
- DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //使能系统时钟源12M;
- DrvSYS_Delay(5000);
- LOCKREG(x);
- UNLOCKREG(x);
- CLK_SPI.CLKSEL0.HCLK_S=0;
- LOCKREG(x);
- }
- void InitGPIO()
- {
- DrvGPIO_Open(E_GPB, 10, E_IO_INPUT);
- DrvGPIO_InitFunction(E_FUNC_SPI1);
- }
- void InitSPI()
- {
- /*******************SPI作为主机的设置;SSR寄存器的设置******************************/
- //DrvSPI_Open(eDRVSPI_PORT1,eDRVSPI_MASTER,eDRVSPI_TYPE1,8);
- SPI_Contrl.DIVIDER.DIVIDER=10; //除频为10;
- SPI_Contrl.SSR.AUTOSS=0; //禁止自动选择位;
- SPI_Contrl.SSR.SS_LVL=0; //该从机信号为低电平触发;
- SPI_Contrl.SSR.SSR=1; //激活片外SPI从机;
- /********************SPI contrl寄存器的设置****************************************/
- SPI_Contrl.CNTRL.SLAVE=1; //主设备
- SPI_Contrl.CNTRL.CLKP=0; //串行时钟低电平为空闲状态;
- SPI_Contrl.CNTRL.TX_NEG=0; //数据在串行时钟为低电平传输;
- SPI_Contrl.CNTRL.RX_NEG=1; //数据在串行时钟为高电平接收;
- SPI_Contrl.CNTRL.TX_BIT_LEN=8; //传输字的长度为8;
- SPI_Contrl.CNTRL.TX_NUM=0; //为一次字传输;
- SPI_Contrl.CNTRL.LSB=0; //高位MSB先发送/接收;
- }
- int main()
- {
- CLK_SPI.APBCLK.SPI1_EN=1;
- InitSYS();
- InitGPIO();
- InitSPI();
- SPI_Contrl.TX[0]=10;
- SPI_Contrl.CNTRL.GO_BUSY=1; //开始SPI口的传输;
- while(1)
- {
- // DrvSPI_Busy(eDRVSPI_PORT0); //判断SPI端口忙否;
- if(SPI_Contrl.CNTRL.GO_BUSY==0)
- {
- Receive_Data=SPI_Contrl.RX[0];
- SPI_Contrl.CNTRL.GO_BUSY=1;
- }
- SPI_Contrl.TX[0]=20;
- }
- }
准备迷糊。。。SPI通信遇到麻烦 主机配置好了,从机是否需要什么配置? 给GO_BUSY置一了,未开中断,用判断GO_BUSY是否为0,若为0说明传输结束,是不是呀?大叔有时间帮我看看。请指教
|