我在做一个模数转换实验,用到了AD7684芯片,碰巧它的三个接口与SPI0接口是兼容的。我将AD7684的CLK接P0.4-SCK0, DOUT接P0.5-MISO0, CS接P0.7-SSEL0,P0.6-MOSI0就悬空着.设计了以下程序,可是总是没有结果,串口接收不到数据,请问有哪位知道是什么错误。谢谢!
# include "config.h"
# include "UART.h"
# include "stdio.h"
# define SLAVE_CS 1 << 7 /* P0.7口作为AD7684从机的片选 */
uint16 const data = 0x99;
uint16 uiVal;
void DelayNS (uint32 uiDly)
{
uint32 i;
for(; uiDly > 0; uiDly--)
{
for(i = 0; i < 50000; i++);
}
}
/*********************************************************************************************************
** Function name: MSPIInit
** Descriptions: 初始化SPI接口,设置为主机
*
*********************************************************************************************************/
void MSPIInit(void)
{
PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; /* 设置SPI引脚连接 */
SPI_SPCCR = 0x52; /* 设置SPI时钟分频 SPI_SPCCR时钟计数寄存器*/
SPI_SPCR = 1 << 2 | /* 每次传输和接受16位数据 */
0 << 3 | /* CPHA = 0第一个时钟采样 SPI_SPCR控制寄存器*/
1 << 4 | /* CPOL = 1,SCK低有效 */
1 << 5 | /* MSTR = 1,设置为主模式 */
0 << 6 | /* LSBF = 0,SPI传输MSB在先 */
0 << 7 | /* SPIE = 0,SPI中断禁止 */
0x0<< 8; /* 每次传输16位*/
}
/*********************************************************************************************************
** Function name: SSPIInit
** Descriptions: 初始化SPI接口,设置为从机
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void SSPIInit(void)
{
PINSEL1 = (PINSEL1 & 0xFFFFF00F) | 0x00000540; /* 设置SSP引脚连接 */
SSPCR0 = 0x07 << 0 | /* DSS 数据长度为8位 */
0x00 << 4 | /* FRF 格式:SPI */
0x01 << 6 | /* CPOL = 1,SCK低电平有效 每帧传输之间保持低电平*/
0x00 << 7 | /* CPHA = 0, 第一个时钟SCK下降沿采样*/
0x05 << 8 ; /* SCR 设置SPI时钟分频 */
SSPCR1 = 0 << 0 | /* LBM 回写模式 :正常工作 */
1 << 1 | /* SSE SSP使能:SSP控制器可以与其它总线上的器件相互通信*/
1 << 2 | /* MSTR = 1,设置为从机 */
0 << 3 ; /* SOD = 0, 从机输出允许 */
SSPCPSR = 0x52; /* 设置SSP时钟分频 */
SSPIMSC = 0x02; /* 使能接收超时中断,软件置位 SSPIMSC中断使能寄存器*/
SSPICR = 0x03; /* 写1清除中断标志 SSPICR中断清楚寄存器*/
}
/*********************************************************************************************************
** Function name: MSPISendData
** Descriptions: SPI主模式发送数据
** input parameters: uiData: 将要发送的数据
** output parameters: 无
** Returned value: S0SPDR: 返回值为读取的数据
*********************************************************************************************************/
uint16 MSPISendData(uint16 uiData)
{
IO0CLR = SLAVE_CS; /* 片选AD,P0.7输出低电平 */
SPI_SPDR = uiData; /* 数据寄存器SPI_SPDR存值 */
while ((SPI_SPSR & 0x80) == 0); /* SPI_SPSR寄存器,1传输完成 等待数据发送完毕*/
IO0SET = SLAVE_CS; /* P0.7输出高电平 */
return(SPI_SPDR);
}
/*********************************************************************************************************
** Function name: SPI_RcvByte
** Descriptions: 从SPI总线接收1字节数据
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
uint16 MSPIRcvByte (void)
{
while ((SPI_SPSR & 0x80) == 0); /* 等待数据接收完成 */
return (SPI_SPDR);
}
/*********************************************************************************************************
** Function name: SSPSendByte
** Descriptions: SSP接口向总线发送1字节数据
** input parameters: uiDat 待发送的数据
** output parameters: 无
** Returned value: 接收到的数据
*********************************************************************************************************/
uint8 SSPSendByte(uint8 uiDat)
{
IOCLR = SLAVE_CS; /* P0.13输出低电平 */
SSPDR = uiDat;
while((SSPSR & 0x01) == 0); /* 等待TFE置位,即发送FIFO空 */
IOSET = SLAVE_CS; /* P0.13输出高电平 */
return(SSPDR);
}
/*********************************************************************************************************
** Function name: SSPRcvByte
** Descriptions: SSP接口从总线接收1字节数据
** input parameters: 无
** output parameters: 无
** Returned value: 接收到的数据
*********************************************************************************************************/
uint8 SSPRcvByte(void)
{
while((SSPSR & 0x04) == 0); /* 等待RFF置位,即接收FIFO不为空*/
return(SSPDR);
}
/*********************************************************************************************************
** Function name: main
** Descriptions: SPI做主机、SSP做从机进行数据通信,并将SPI发送的数据通过串口发送到PC机显示
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main(void)
{
char cStr[20];
PINSEL0 = PINSEL0 & (~(0x03 << 14)); /* 设置GPIO引脚连接 P0.7 */
//PINSEL0 = PINSEL0 & (~(0x02A << 8)); /* P0.4-CLK,P0.5-MISO,P0.6-MOSI*/
IO0DIR = SLAVE_CS; /* 设置AD片选为输出 P0.7输出低电平,选中ADS7684*/
MSPIInit(); /* 初始化SPI接口 */
UARTInit();
while(1)
{
IO0CLR = SLAVE_CS;
DelayNS(10);
SPI_SPDR = data; /* 主模式SPI发送数据,启动SDK */
while((SPI_SPSR & 0x80)==0); /* 等待数据发送结束 */
uiVal = SPI_SPDR;
IO0SET = SLAVE_CS; /* P0.7输出高电平 */
sprintf(cStr,"hello %4d\n",uiVal); //将数据以字符形式存储
ISendStr(0,0,0x30,cStr); //通过向PC机发送数据
}
return 0;
} |