| 
 
| 这两天一直在调试NUC120的SPI接口,我用新唐官方给出的BSP例程下面的Driver里面的SPI程序来跑,就是跑不通。。。 那个例程里面的General SPI data transfer一项,程序再怎么运行,就是不能在串口调试助手上显示[PASS],只能显示到
 SPI0/1 Loopback test,似乎程序在底下数据传输部分卡死了,这是怎么回事?我自己按照例程的思想,写了一段测试程序,让SPI0为主机,SPI1为从机,让主机发送一串数据,从机接收这一串数据,比较接收的数据与发送的数据是否相同。若相同,则
 表示主机对从机的通信OK,可是结果也不行。调试发现,数据一直写不进SPI0_TX0寄存器中,这是怎么回事?有哪位高人帮忙指点下啊???我的代码在下面。。。
 #include <stdio.h>
 #include "NUC1xx.h"
 #include "Driver/DrvSYS.h"
 #include "Driver/DrvGPIO.h"
 #include "Driver/DrvSPI.h"
 #include "Driver/DrvUART.h"
 
 uint32_t fasong[1] = { 0x66666666 };
 uint32_t jieshou[1] = { 0x00000000 };
 
 void FaSong_ShuJu(void)
 {
 uint32_t num2;
 num2 = 0;
 DrvSPI_SetTxRegister(eDRVSPI_PORT1,&num2,1); //写空数据到SPI1的发送寄存器防止SPI1发送数据到主机
 DrvSPI_SetGo(eDRVSPI_PORT1);   //从机准备好与主机进行通信
 DrvSPI_SingleWrite(eDRVSPI_PORT0, &fasong[0]);
 
 while(DrvSPI_IsBusy(eDRVSPI_PORT0));
 
 DrvSPI_SingleRead(eDRVSPI_PORT1, &jieshou[0]);
 
 if(jieshou[0] != fasong[0])
 {
 printf("SPI Data Transfer is Error!\r\n");
 }
 else
 {
 printf("SPI Data Transfer is OK!\r\n");
 }
 jieshou[0] = 0x00000000;
 }
 
 int main(void)
 {
 STR_UART_T param;
 
 UNLOCKREG();
 DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
 DrvSYS_Delay(5000);
 //DrvSYS_Open(50000000);
 DrvSYS_SelectHCLKSource(0);
 LOCKREG();
 DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);
 DrvGPIO_InitFunction(E_FUNC_UART0);
 DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); //选择UART时钟源为外部12MHz
 
 DrvSYS_SetClockDivider(E_SYS_UART_DIV, 0);    //UART时钟除频值为0
 DrvSYS_SetIPClock(E_SYS_UART0_CLK, 1);            //使能UART0时钟
 param.u32BaudRate        = 115200;    // 波特率
 param.u8cDataBits        = DRVUART_DATABITS_8;  // 数据位
 param.u8cStopBits        = DRVUART_STOPBITS_1;  // 停止位
 param.u8cParity          = DRVUART_PARITY_NONE;    // 校验位
 param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;    // FIFO存储深度1字节
 param.u8TimeOut          = 0; // FIFO超时设定
 DrvUART_Open(UART_PORT0, ¶m);                  //打开UART0
 
 printf("This is SPI TEST item!\r");
 
 DrvGPIO_InitFunction(E_FUNC_SPI0);   //配置SPI0端口
 /****配置SPI0为主机,每笔传输长度为8位,时钟空闲状态为低电平,时钟下降沿传输数据,上升沿锁存数据*****/
 DrvSPI_Open(eDRVSPI_PORT0, eDRVSPI_MASTER, eDRVSPI_TYPE1, 32);
 
 DrvSPI_SetEndian(eDRVSPI_PORT0,eDRVSPI_MSB_FIRST); //指定MSB优先
 
 DrvSPI_EnableAutoSS(eDRVSPI_PORT0, eDRVSPI_SS0);   //使能自动从选择并激活从选择引脚ss0
 
 DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT0, eDRVSPI_ACTIVE_LOW_FALLING); //设定从选择线的激活电平
 
 DrvSPI_SetClockFreq(eDRVSPI_PORT0, 2000000, 0);
 DrvSYS_SetIPClock(E_SYS_SPI0_CLK, 1);
 
 DrvGPIO_InitFunction(E_FUNC_SPI1);   //配置SPI1端口
 DrvSPI_Open(eDRVSPI_PORT1, eDRVSPI_SLAVE, eDRVSPI_TYPE1, 32);
 DrvSPI_SetTriggerMode(eDRVSPI_PORT1, eDRVSPI_EDGE_TRIGGER);  //配置从选择引脚触发模式为边沿触发
 DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);
 while(1)
 {
 FaSong_ShuJu();
 }
 }
 | 
 |