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

[复制链接]
1790|6
 楼主| wushaojay 发表于 2015-1-9 12:28 | 显示全部楼层 |阅读模式
本帖最后由 wushaojay 于 2015-1-9 15:09 编辑
  1. #include <stdio.h>
  2. #include <csl.h>
  3. #include <csl_pll.h>
  4. #include <csl_gpio.h>
  5. #include <csl_mcbsp.h>
  6. //#include <csl_irq.h>

  7. //---------Global constants---------
  8. #define N       20

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

  21. //---------Global data definition---------
  22. MCBSP_Config Configclockstop8= {
  23.   MCBSP_SPCR1_RMK(
  24.     MCBSP_SPCR1_DLB_OFF,                   /* DLB    = 0 禁止数字回环*/
  25.     MCBSP_SPCR1_RJUST_RZF,                 /* RJUST  = 0 接收数据符号拓展和调整方式*/
  26.     MCBSP_SPCR1_CLKSTP_NODELAY,            /* 重要CLKSTP = 10 时钟停止模式 与CLKXP有关*/
  27.     MCBSP_SPCR1_DXENA_NA,                  /* DXENA  = 0 DX引脚延时使能*/
  28.     MCBSP_SPCR1_ABIS_DISABLE,              /* ABIS   = 0 关闭abis*/
  29.     MCBSP_SPCR1_RINTM_RRDY,                /* RINTM  = 0 接收中断模式*/
  30.     0,                                     /* RSYNCER = 0 接收帧同步错误标志*/
  31.     MCBSP_SPCR1_RRST_DISABLE               /* RRST   = 0 接收器复位*/
  32.   ),
  33.     MCBSP_SPCR2_RMK(
  34.     MCBSP_SPCR2_FREE_NO,                   /* FREE   = 0 */
  35.     MCBSP_SPCR2_SOFT_NO,                   /* SOFT   = 0 */
  36.     MCBSP_SPCR2_FRST_RESET,                /* FRST   = 0 */
  37.     MCBSP_SPCR2_GRST_RESET,                /* GRST   = 0 */
  38.     MCBSP_SPCR2_XINTM_XRDY,                /* XINTM  = 0 */
  39.     0,                                     /* XSYNCER = N/A */
  40.     MCBSP_SPCR2_XRST_DISABLE               /* XRST   = 0 */
  41.    ),
  42.   MCBSP_RCR1_RMK(
  43.   MCBSP_RCR1_RFRLEN1_OF(0),                /* RFRLEN1 = 0 帧长为一字*/
  44.   MCBSP_RCR1_RWDLEN1_8BIT                 /* RWDLEN1 = 0 每字为8bite*/
  45.   ),
  46. MCBSP_RCR2_RMK(   
  47.     MCBSP_RCR2_RPHASE_SINGLE,              /* RPHASE  = 0 模式一:只与RCR1有关*/
  48.     MCBSP_RCR2_RFRLEN2_OF(0),              /* RFRLEN2 = 0 */
  49.     MCBSP_RCR2_RWDLEN2_8BIT,               /* RWDLEN2 = 0 */
  50.     MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 非压缩模式*/
  51.     MCBSP_RCR2_RFIG_YES,                    /* 重要RFIG    = 0 忽略错误的帧同步信号 */
  52.     MCBSP_RCR2_RDATDLY_1BIT                /* RDATDLY = 1 延时1bit*/
  53.     ),  
  54.    MCBSP_XCR1_RMK(   
  55.     MCBSP_XCR1_XFRLEN1_OF(0),              /* XFRLEN1 = 0 帧长为一字*/
  56.     MCBSP_XCR1_XWDLEN1_8BIT               /* XWDLEN1 = 0 每字8bite*/
  57.    
  58. ),   
  59. MCBSP_XCR2_RMK(   
  60.     MCBSP_XCR2_XPHASE_SINGLE,              /* XPHASE  = 0 模式一:帧长只与XCR1有关*/
  61.     MCBSP_XCR2_XFRLEN2_OF(0),              /* XFRLEN2 = 0 */
  62.     MCBSP_XCR2_XWDLEN2_8BIT,               /* XWDLEN2 = 0 */
  63.     MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 不拓展*/
  64.     MCBSP_XCR2_XFIG_YES,                   /* 重要XFIG    = 0 忽略错误的帧同步信号*/
  65.     MCBSP_XCR2_XDATDLY_1BIT                /* XDATDLY =1 发送数据延时1bit*/
  66.   ),            
  67. MCBSP_SRGR1_RMK(
  68.    MCBSP_SRGR1_FWID_OF(0),                /* 停止模式无效**重要FWID    = 0 帧同步信号的脉宽周期数*/
  69.    MCBSP_SRGR1_CLKGDV_OF(5)               /* 停止模式无效**重要CLKGDV  =9 CLKG时钟频率*/
  70. ),   
  71. MCBSP_SRGR2_RMK(  
  72.     MCBSP_SRGR2_GSYNC_FREE,                /* FREE    = 0 内部时钟帧同步 */
  73.     MCBSP_SRGR2_CLKSP_RISING,              /* 重要CLKSP   = 0 CLKS 引脚极性*/
  74.     MCBSP_SRGR2_CLKSM_INTERNAL,            /* 重要CLKSM   = 1 cpu时钟*/
  75.     MCBSP_SRGR2_FSGM_DXR2XSR,              /* FSGM    = 0 发送帧同步模式,如果FXSM=1,当DXR->XSR时,McBSP产生帧同步信号*/
  76.     MCBSP_SRGR2_FPER_OF(10)                 /*重要 FPER    = 0 FSG信号帧同步时钟周期数,应该是7*/
  77. ),  
  78. MCBSP_MCR1_DEFAULT,
  79. MCBSP_MCR2_DEFAULT,
  80. MCBSP_PCR_RMK(
  81.    MCBSP_PCR_IDLEEN_RESET,                 /* IDLEEN   = 0   省电使能*/
  82.    MCBSP_PCR_XIOEN_SP,                     /* XIOEN    = 0   发送GPIO使能*/
  83.    MCBSP_PCR_RIOEN_SP,                     /* RIOEN    = 0   接收GPIO使能*/
  84.    MCBSP_PCR_FSXM_INTERNAL,                /* 重要FSXM     = 1  发送帧同步模式,0由FSX引脚提供,1由McBSP提供*/
  85.    MCBSP_PCR_FSRM_INTERNAL,                /* 重要FSRM     = 1   接收帧同步模式,0由FSR引脚提供,1由McBSP提供*/
  86.    MCBSP_PCR_CLKXM_OUTPUT,                 /* 关键CLKXM = 1   主从模式*/
  87.    MCBSP_PCR_CLKRM_INPUT,                  /* 关键CLKRM  = 0   主从模式*/
  88.    MCBSP_PCR_SCLKME_NO,                    /* SCLKME   = 0   与CLKSM配合使用,cpu时钟模式*/
  89.    0,                                      /* DXSTAT = N/A   DX引脚上的电平*/
  90.    1,  //MCBSP_PCR_FSXP_ACTIVELOW,              /* 重要FSXP     = 0   发送帧同步极性,0正极性,1负极性*/
  91.    1,//MCBSP_PCR_FSRP_ACTIVELOW,              /* 重要FSRP     = 0   接收帧同步极性,0正极性,1负极性*/
  92.    MCBSP_PCR_CLKXP_RISING,                 /* 重要CLKXP   = 0   发送时钟极性,0正极性,1负极性*/
  93.    MCBSP_PCR_CLKRP_FALLING                 /* 重要CLKRP   = 0   接收时钟极性,0正极性,CLKR引脚上的上升沿,产生CLKG的上升沿,1负极性*/
  94. ),
  95. MCBSP_RCERA_DEFAULT,
  96. MCBSP_RCERB_DEFAULT,
  97. MCBSP_RCERC_DEFAULT,
  98. MCBSP_RCERD_DEFAULT,
  99. MCBSP_RCERE_DEFAULT,
  100. MCBSP_RCERF_DEFAULT,
  101. MCBSP_RCERG_DEFAULT,
  102. MCBSP_RCERH_DEFAULT,
  103. MCBSP_XCERA_DEFAULT,
  104. MCBSP_XCERB_DEFAULT,
  105. MCBSP_XCERC_DEFAULT,
  106. MCBSP_XCERD_DEFAULT,  
  107. MCBSP_XCERE_DEFAULT,
  108. MCBSP_XCERF_DEFAULT,  
  109. MCBSP_XCERG_DEFAULT,
  110. MCBSP_XCERH_DEFAULT
  111. };      
  112. /* Define a MCBSP_Handle object to be used with MCBSP_open function */
  113. MCBSP_Handle mhMcbsp;

  114. /*********************************************************************
  115. **        SPI定义与函数                                                      
  116. **********************************************************************/


  117. /*************长延时,待使用*********/
  118. void Delay(unsigned int s)
  119. {
  120.         unsigned int i;
  121.         for(i=0; i<s; i++);
  122.         for(i=0; i<s; i++);
  123. }


  124. /******************************************************************************************
  125. 延时函数,依照时钟频率而定,待使用
  126. *****************************************************************************************/
  127. void inerDelay_us(unsigned char n)
  128. {
  129.         for(;n>0;n--)
  130.                 _nop();
  131. }
  132. /****************************************************************************************************
  133. 函数:uint SPI_RW(uint uchar)
  134. 功能:SPI写时序     已修改
  135. ****************************************************************************************************/
  136. Uchar SPI_RW(MCBSP_Handle mh_Mcbsp,Uchar uchar_d)
  137. {
  138.         Uchar get_data;
  139.         while(!MCBSP_xrdy(mh_Mcbsp));
  140.         MCBSP_write16(mh_Mcbsp,uchar_d); //写寄存器地址
  141.         while(!MCBSP_rrdy(mh_Mcbsp));
  142.     get_data=MCBSP_read16(mh_Mcbsp); //读寄存器中的值
  143. //        printf("%d\n",get_data);
  144.     return(get_data);                             // return read uchar
  145. }
  146. /****************************************************************************************************
  147. 函数:uchar SPI_Read(uchar reg)                   已修改
  148. 功能:SPI读时序
  149. ****************************************************************************************************/
  150. Uchar SPI_Read(MCBSP_Handle mh_Mcbsp,Uchar reg)
  151. {
  152.         Uchar reg_val;        
  153.         SPI_RW(mh_Mcbsp,reg);            // 写寄存器地址.
  154.         reg_val = SPI_RW(mh_Mcbsp,0);    // 读该寄存器中的数据        
  155.         //        printf("%d\n",reg_val);
  156.         return(reg_val);        // 返回寄存器的值
  157. }
  158. /****************************************************************************************************
  159. 功能:读写寄存器函数           已修改
  160. ****************************************************************************************************/
  161. Uchar SPI_RW_Reg(MCBSP_Handle mh_Mcbsp,Uchar reg, Uchar value)
  162. {
  163.         Uchar status;
  164.         status = SPI_RW(mh_Mcbsp,reg);      // 写寄存器地址
  165.         _nop();        _nop();
  166.         SPI_RW(mh_Mcbsp,value);             //写数据到该寄存器
  167.         return(status);            // 返回写入的数据
  168. }

  169. /*********************************************************************
  170. **        SPI定义与函数                                                      
  171. **********************************************************************/


  172. //---------main routine---------
  173. void main(void)
  174. {
  175.           int a;
  176.             /*初始化CSL库*/
  177.     CSL_init();
  178.          /*EMIF为全EMIF接口*/
  179.     CHIP_RSET(XBSR,0x0a01);   
  180.     /*设置系统的运行速度为144MHz*/
  181.     PLL_config(&myConfig);

  182.     mhMcbsp = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);
  183.     MCBSP_config(mhMcbsp, &Configclockstop8);
  184.     MCBSP_start(mhMcbsp,
  185.                 MCBSP_RCV_START|MCBSP_XMIT_START|MCBSP_SRGR_START|MCBSP_SRGR_FRAMESYNC,
  186.                 0x300u);
  187.         Delay(100);
  188.          while(1)
  189.         {
  190.          SPI_RW_Reg(mhMcbsp,0x80,1);
  191.         a=SPI_Read(mhMcbsp,0x01);
  192.         printf("%d",a);
  193.         }
  194. }

 楼主| 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
你这是啥型号的DSP,我咋感觉挺别扭呢,SPI怎么跟多路缓冲扯到一块去了

ti5509
 楼主| wushaojay 发表于 2015-1-9 15:14 | 显示全部楼层
这是我写的专门写0和写1的程序,测试各个引脚的图,这是程序

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

69

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部