这两天一直在调试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();
}
} |