打印

NUC120的SPI接口求救。。。

[复制链接]
2781|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Mcuzone-ARM2|  楼主 | 2011-10-9 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这两天一直在调试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, &param);                  //打开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();
}
}

相关帖子

沙发
6019赵文| | 2011-10-10 00:07 | 只看该作者
你能用示波器测到波形不?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

14

帖子

1

粉丝