wushaojay 发表于 2015-1-9 12:28

用5509配置的SPI ,数据一直写不进,求有心人帮忙看看 分析

本帖最后由 wushaojay 于 2015-1-9 15:09 编辑

#include <stdio.h>
#include <csl.h>
#include <csl_pll.h>
#include <csl_gpio.h>
#include <csl_mcbsp.h>
//#include <csl_irq.h>

//---------Global constants---------
#define N       20

/*锁相环的设置*/
PLL_ConfigmyConfig      = {
0,    //IAI: the PLL locks using the same process that was underway
                //before the idle mode was entered
1,    //IOB: If the PLL indicates a break in the phase lock,
                //it switches to its bypass mode and restarts the PLL phase-locking
                //sequence
10,    //PLL multiply value; multiply 24 times
1             //Divide by 2 PLL divide value; it can be either PLL divide value
                //(when PLL is enabled), or Bypass-mode divide value
                //(PLL in bypass mode, if PLL multiply value is set to 1)
};

//---------Global data definition---------
MCBSP_Config Configclockstop8= {
MCBSP_SPCR1_RMK(
    MCBSP_SPCR1_DLB_OFF,                   /* DLB    = 0 禁止数字回环*/
    MCBSP_SPCR1_RJUST_RZF,               /* RJUST= 0 接收数据符号拓展和调整方式*/
    MCBSP_SPCR1_CLKSTP_NODELAY,            /* 重要CLKSTP = 10 时钟停止模式 与CLKXP有关*/
    MCBSP_SPCR1_DXENA_NA,                  /* DXENA= 0 DX引脚延时使能*/
    MCBSP_SPCR1_ABIS_DISABLE,            /* ABIS   = 0 关闭abis*/
    MCBSP_SPCR1_RINTM_RRDY,                /* RINTM= 0 接收中断模式*/
    0,                                     /* RSYNCER = 0 接收帧同步错误标志*/
    MCBSP_SPCR1_RRST_DISABLE               /* RRST   = 0 接收器复位*/
),
    MCBSP_SPCR2_RMK(
    MCBSP_SPCR2_FREE_NO,                   /* FREE   = 0 */
    MCBSP_SPCR2_SOFT_NO,                   /* SOFT   = 0 */
    MCBSP_SPCR2_FRST_RESET,                /* FRST   = 0 */
    MCBSP_SPCR2_GRST_RESET,                /* GRST   = 0 */
    MCBSP_SPCR2_XINTM_XRDY,                /* XINTM= 0 */
    0,                                     /* XSYNCER = N/A */
    MCBSP_SPCR2_XRST_DISABLE               /* XRST   = 0 */
   ),
MCBSP_RCR1_RMK(
MCBSP_RCR1_RFRLEN1_OF(0),                /* RFRLEN1 = 0 帧长为一字*/
MCBSP_RCR1_RWDLEN1_8BIT               /* RWDLEN1 = 0 每字为8bite*/
),
MCBSP_RCR2_RMK(   
    MCBSP_RCR2_RPHASE_SINGLE,            /* RPHASE= 0 模式一:只与RCR1有关*/
    MCBSP_RCR2_RFRLEN2_OF(0),            /* RFRLEN2 = 0 */
    MCBSP_RCR2_RWDLEN2_8BIT,               /* RWDLEN2 = 0 */
    MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 非压缩模式*/
    MCBSP_RCR2_RFIG_YES,                  /* 重要RFIG    = 0 忽略错误的帧同步信号 */
    MCBSP_RCR2_RDATDLY_1BIT                /* RDATDLY = 1 延时1bit*/
    ),
   MCBSP_XCR1_RMK(   
    MCBSP_XCR1_XFRLEN1_OF(0),            /* XFRLEN1 = 0 帧长为一字*/
    MCBSP_XCR1_XWDLEN1_8BIT               /* XWDLEN1 = 0 每字8bite*/
   
),   
MCBSP_XCR2_RMK(   
    MCBSP_XCR2_XPHASE_SINGLE,            /* XPHASE= 0 模式一:帧长只与XCR1有关*/
    MCBSP_XCR2_XFRLEN2_OF(0),            /* XFRLEN2 = 0 */
    MCBSP_XCR2_XWDLEN2_8BIT,               /* XWDLEN2 = 0 */
    MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 不拓展*/
    MCBSP_XCR2_XFIG_YES,                   /* 重要XFIG    = 0 忽略错误的帧同步信号*/
    MCBSP_XCR2_XDATDLY_1BIT                /* XDATDLY =1 发送数据延时1bit*/
),            
MCBSP_SRGR1_RMK(
   MCBSP_SRGR1_FWID_OF(0),                /* 停止模式无效**重要FWID    = 0 帧同步信号的脉宽周期数*/
   MCBSP_SRGR1_CLKGDV_OF(5)               /* 停止模式无效**重要CLKGDV=9 CLKG时钟频率*/
),   
MCBSP_SRGR2_RMK(
    MCBSP_SRGR2_GSYNC_FREE,                /* FREE    = 0 内部时钟帧同步 */
    MCBSP_SRGR2_CLKSP_RISING,            /* 重要CLKSP   = 0 CLKS 引脚极性*/
    MCBSP_SRGR2_CLKSM_INTERNAL,            /* 重要CLKSM   = 1 cpu时钟*/
    MCBSP_SRGR2_FSGM_DXR2XSR,            /* FSGM    = 0 发送帧同步模式,如果FXSM=1,当DXR->XSR时,McBSP产生帧同步信号*/
    MCBSP_SRGR2_FPER_OF(10)               /*重要 FPER    = 0 FSG信号帧同步时钟周期数,应该是7*/
),
MCBSP_MCR1_DEFAULT,
MCBSP_MCR2_DEFAULT,
MCBSP_PCR_RMK(
   MCBSP_PCR_IDLEEN_RESET,               /* IDLEEN   = 0   省电使能*/
   MCBSP_PCR_XIOEN_SP,                     /* XIOEN    = 0   发送GPIO使能*/
   MCBSP_PCR_RIOEN_SP,                     /* RIOEN    = 0   接收GPIO使能*/
   MCBSP_PCR_FSXM_INTERNAL,                /* 重要FSXM   = 1发送帧同步模式,0由FSX引脚提供,1由McBSP提供*/
   MCBSP_PCR_FSRM_INTERNAL,                /* 重要FSRM   = 1   接收帧同步模式,0由FSR引脚提供,1由McBSP提供*/
   MCBSP_PCR_CLKXM_OUTPUT,               /* 关键CLKXM = 1   主从模式*/
   MCBSP_PCR_CLKRM_INPUT,                  /* 关键CLKRM= 0   主从模式*/
   MCBSP_PCR_SCLKME_NO,                  /* SCLKME   = 0   与CLKSM配合使用,cpu时钟模式*/
   0,                                    /* DXSTAT = N/A   DX引脚上的电平*/
   1,//MCBSP_PCR_FSXP_ACTIVELOW,            /* 重要FSXP   = 0   发送帧同步极性,0正极性,1负极性*/
   1,//MCBSP_PCR_FSRP_ACTIVELOW,            /* 重要FSRP   = 0   接收帧同步极性,0正极性,1负极性*/
   MCBSP_PCR_CLKXP_RISING,               /* 重要CLKXP   = 0   发送时钟极性,0正极性,1负极性*/
   MCBSP_PCR_CLKRP_FALLING               /* 重要CLKRP   = 0   接收时钟极性,0正极性,CLKR引脚上的上升沿,产生CLKG的上升沿,1负极性*/
),
MCBSP_RCERA_DEFAULT,
MCBSP_RCERB_DEFAULT,
MCBSP_RCERC_DEFAULT,
MCBSP_RCERD_DEFAULT,
MCBSP_RCERE_DEFAULT,
MCBSP_RCERF_DEFAULT,
MCBSP_RCERG_DEFAULT,
MCBSP_RCERH_DEFAULT,
MCBSP_XCERA_DEFAULT,
MCBSP_XCERB_DEFAULT,
MCBSP_XCERC_DEFAULT,
MCBSP_XCERD_DEFAULT,
MCBSP_XCERE_DEFAULT,
MCBSP_XCERF_DEFAULT,
MCBSP_XCERG_DEFAULT,
MCBSP_XCERH_DEFAULT
};      
/* Define a MCBSP_Handle object to be used with MCBSP_open function */
MCBSP_Handle mhMcbsp;

/*********************************************************************
**      SPI定义与函数                                                      
**********************************************************************/


/*************长延时,待使用*********/
void Delay(unsigned int s)
{
      unsigned int i;
      for(i=0; i<s; i++);
      for(i=0; i<s; i++);
}


/******************************************************************************************
延时函数,依照时钟频率而定,待使用
*****************************************************************************************/
void inerDelay_us(unsigned char n)
{
      for(;n>0;n--)
                _nop();
}
/****************************************************************************************************
函数:uint SPI_RW(uint uchar)
功能:SPI写时序   已修改
****************************************************************************************************/
Uchar SPI_RW(MCBSP_Handle mh_Mcbsp,Uchar uchar_d)
{
      Uchar get_data;
      while(!MCBSP_xrdy(mh_Mcbsp));
      MCBSP_write16(mh_Mcbsp,uchar_d); //写寄存器地址
      while(!MCBSP_rrdy(mh_Mcbsp));
    get_data=MCBSP_read16(mh_Mcbsp); //读寄存器中的值
//      printf("%d\n",get_data);
    return(get_data);                           // return read uchar
}
/****************************************************************************************************
函数:uchar SPI_Read(uchar reg)                   已修改
功能:SPI读时序
****************************************************************************************************/
Uchar SPI_Read(MCBSP_Handle mh_Mcbsp,Uchar reg)
{
      Uchar reg_val;      
      SPI_RW(mh_Mcbsp,reg);            // 写寄存器地址.
      reg_val = SPI_RW(mh_Mcbsp,0);    // 读该寄存器中的数据      
      //      printf("%d\n",reg_val);
      return(reg_val);      // 返回寄存器的值
}
/****************************************************************************************************
功能:读写寄存器函数         已修改
****************************************************************************************************/
Uchar SPI_RW_Reg(MCBSP_Handle mh_Mcbsp,Uchar reg, Uchar value)
{
      Uchar status;
      status = SPI_RW(mh_Mcbsp,reg);      // 写寄存器地址
      _nop();      _nop();
      SPI_RW(mh_Mcbsp,value);             //写数据到该寄存器
      return(status);            // 返回写入的数据
}

/*********************************************************************
**      SPI定义与函数                                                      
**********************************************************************/


//---------main routine---------
void main(void)
{
          int a;
            /*初始化CSL库*/
    CSL_init();
         /*EMIF为全EMIF接口*/
    CHIP_RSET(XBSR,0x0a01);   
    /*设置系统的运行速度为144MHz*/
    PLL_config(&myConfig);

    mhMcbsp = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);
    MCBSP_config(mhMcbsp, &Configclockstop8);
    MCBSP_start(mhMcbsp,
                MCBSP_RCV_START|MCBSP_XMIT_START|MCBSP_SRGR_START|MCBSP_SRGR_FRAMESYNC,
                0x300u);
      Delay(100);
         while(1)
      {
         SPI_RW_Reg(mhMcbsp,0x80,1);
      a=SPI_Read(mhMcbsp,0x01);
      printf("%d",a);
      }
}

wushaojay 发表于 2015-1-9 12:32

主要使用SPI配置AD9857寄存器

wushaojay 发表于 2015-1-9 13:18

这是我在示波器上观察的 FSX引脚和 CLKX引脚
FSXP=1设置的是低电平有效 但不知为何观察的波形是这样的
另外CLKX不是连续发送的吗 我观察的波形都是一段一段的 每段8个上升沿

wushaojay 发表于 2015-1-9 14:46

在帧引脚低电平有效的时候,正好是因为8个脉冲时钟上升沿,因为用得无压缩模式,所以采用的是8bit数据传输。


但是在AD9857中 一个通信周期是分两段,先写寄存器地址再写数据,地址八位 数据八位,那么只好要16个时钟周期,而上面设置的SPI一帧(FSX为低电平时)只有8bit,所以我猜是不是这样导致我一直操作不成功。不知道该怎么设置了,感觉这块有点乱

wang168506 发表于 2015-1-9 14:57

你这是啥型号的DSP,我咋感觉挺别扭呢,SPI怎么跟多路缓冲扯到一块去了

wushaojay 发表于 2015-1-9 15:09

wang168506 发表于 2015-1-9 14:57 static/image/common/back.gif
你这是啥型号的DSP,我咋感觉挺别扭呢,SPI怎么跟多路缓冲扯到一块去了

ti5509

wushaojay 发表于 2015-1-9 15:14

这是我写的专门写0和写1的程序,测试各个引脚的图,这是程序

这是FSX引脚
这是DX
最后两个是CLKX



页: [1]
查看完整版本: 用5509配置的SPI ,数据一直写不进,求有心人帮忙看看 分析