DSP2812的SPI如何读取光编信息,
现在面临的问题是,SPI给光编发下去控制指令,光编能反馈信息,示波器也能够测出来波形,但是SPI的SOMI口读不进去反馈的信息。代码如下,求各位大神指导是不是程序哪块写的不对呢?
/*********************************************************************
** 实验目的:通过学习本实验来掌握DSP的SPI工作原理 **
** 实验说明:SPI是一高速同步的串行输入输出口,它的通信速率和通信数据 **
** 长度都是可编程的,可以接收和发送16位的数据位,并且带有双 **
** 缓冲的.SPI的4个外部引脚由:从输出主输入(SPISOMI),
** 从输入主输出(SPISIMO),从发送使能(/SPISTE),串行时钟 **
** 引脚(SPICLK)组成。主要硬件部分:DSP,74HC595(串入并出 **
** 的移位器),共阳数码管。SPIMOSI和SPICLK直接从DSP接到了 **
** 74HC595的SER和SRCLK,作为数据和时钟信号的输入,SPISTE引**
** 脚接到了74HC595的RCLK以控制其选通。 **
** 实验结果:可看到数码管从0~F循环显示 **
**********************************************************************/
#include "DSP28_Device.h"
void WriteLED(unsigned char data); //送给光编的数据函数
void ReadLED(unsigned char data); //读光编的数据函数
unsigned char rdata_SPI[16]={0};
unsigned long int a;
Uint16 rdata;
Uint16 SpiCode[]={0x207F};//{0x28FF};
//{0x0000,0x0000,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF}; //送给光编的数据函数,这个为使能信号
void main(void)
{
int k,j,m,c;
int flag=0;
/*初始化系统*/
InitSysCtrl();
/* 关中断 */
DINT;
IER = 0x0000;
IFR = 0x0000;
/* 初始化PIE控制寄存器 */
InitPieCtrl();
/* 初始化PIE参数表 */
InitPieVectTable();
/* 初始化外设寄存器 */
InitGpio();
InitSpi();
/*设置CPU*/
EINT; // 开全局中断
ERTM; // 开实时中断
for(;;)
{
GpioDataRegs.GPADAT.bit.GPIOA0=1;
// GpioDataRegs.GPFDAT.bit.GPIOF3=0; //输出低电平选中驱动芯片(74HC595),
WriteLED(SpiCode[k]); //发送数据函数
//for(c=0;c<30;c++);//问题加上延时后数据会变化
if(Spi_RxReady()==1); //当检测到SPI接收准备信号致1时,开始接收数据
{
//for(c=0;c<8;c++);//延迟不能放在读函数之内
rdata=SpiaRegs.SPIRXBUF;//(SpiaRegs.SPIRXBUF>>6);
}
// GpioDataRegs.GPADAT.bit.GPIOA0=1;
while(Spi_TxReady()!=1); //一直等待直到数据发送完成
{
for(a=0;a<52;a++);//原来是60,这样延时0.2us
GpioDataRegs.GPADAT.bit.GPIOA0=0;
}
for(a=0;a<1000;a++); //500000
}
}
/****************************************************************************
*
*名 称:WriteLED()
*
*功 能:SPI发送数据
*
*入口参数:char data,需要发送的数据
*
*出口参数:无
*
****************************************************************************/
void WriteLED(unsigned char data)
{
if(Spi_TxReady() == 1) //当检测到SPI发送准备信号致1时,开始发送数据
{
SpiaRegs.SPITXBUF = data; //把数据写如SPI发送缓冲区
}
while(Spi_TxReady()!=1); //一直等待直到数据发送完成
{
}
// GpioDataRegs.GPFDAT.bit.GPIOF3=1; //退出时关片选(这个是片选芯片的,实际先不用试试,光编无片选信号)
//GpioDataRegs.GPADAT.bit.GPIOA0=1;
}
//===========================================================================
// No more.
//===========================================================================
void ReadLED(unsigned char data)
{
if(Spi_RxReady() == 1) //当检测到SPI接收准备信号致1时,开始接收数据
{
data=SpiaRegs.SPIRXBUF;
//if(rdata_SPI[1]==0x207F) //收到正确的帖头
//SpiaRegs.SPIRXBUF = data; //把数据写如SPI发送缓冲区
}
while(Spi_RxReady()!=1); //一直等待直到数据接收完成
{
}
// GpioDataRegs.GPFDAT.bit.GPIOF3=1; //退出时关片选(这个是片选芯片的,实际先不用试试,光编无片选信号)
}
此帖出自
小平头技术问答
一周热门 更多>