[技术问答] MUCXX SPI 调试有时钟,但是看不到数据,求教

[复制链接]
2230|5
 楼主| niuyaliang 发表于 2014-2-14 12:07 | 显示全部楼层 |阅读模式
本帖最后由 niuyaliang 于 2014-2-17 12:42 编辑

我选择SPI的主机模式,然后把四根线都悬空,主函数不停的发送一个值,我用逻辑分析仪抓引脚的波形,应该能看到输出的数据了,可是我把官网给的程序烧进去,只看得到时钟的和SS引脚的波形,看不到数据的波形,这是怎么一回事

五楼更新代码
a_ziliu 发表于 2014-2-14 16:07 | 显示全部楼层
可以貼上代碼嗎?只有文字描述,這樣很難理解問題在那。
 楼主| niuyaliang 发表于 2014-2-14 18:15 | 显示全部楼层
a_ziliu 发表于 2014-2-14 16:07
可以貼上代碼嗎?只有文字描述,這樣很難理解問題在那。
  1.         /* Step 1. Enable and Select SPI clock source*/
  2.         SYSCLK->APBCLK.SPI0_EN  =1;
  3.         SYS->IPRSTC2.SPI0_RST   =1;
  4.         SYS->IPRSTC2.SPI0_RST   =0;

  5.         /* Step 2. GPIO initial */
  6.         SYS->GPCMFP.SPI0_SS0_I2SLRCLK         =1;
  7.         SYS->GPCMFP.SPI0_CLK_I2SBCLK         =1;
  8.         SYS->GPCMFP.SPI0_MISO0_I2SDI         =1;
  9.         SYS->GPCMFP.SPI0_MOSI0_I2SDO         =1;

  10.         /* Step 3. Set SCLK */
  11.         SPI0->DIVIDER.DIVIDER        =4;        // HCLK/(DIVIDER+1) = 22.1184Mhz/(4+1) = 4.42568Mhz

  12.         /* Step 4. Select Operation mode */
  13.         SPI0->CNTRL.SLAVE = 0;                //Master mode

  14.         SPI0->CNTRL.LSB = 0;                //MSB
  15. //        SPI0->CNTRL.TX_BIT_LEN = 8; //Length:8 bit

  16.         SPI0->CNTRL.CLKP = 1;                //SCLK idle high
  17.         SPI0->CNTRL.TX_NEG = 1;                //Change SDO on falling edge of SCLK
  18.         SPI0->CNTRL.RX_NEG = 0;                //Latch SDI on rising edge of SCLK

  19.         SPI0->SSR.AUTOSS = 0;                         //Disable automatic slave select
  20.         SPI0->SSR.SS_LVL = 0;                //SS low active
  21. //        SPI0->SSR.SSR = 1;                        //SPI0_SS0


SPI的初始化部分
 楼主| niuyaliang 发表于 2014-2-14 18:16 | 显示全部楼层
a_ziliu 发表于 2014-2-14 16:07
可以貼上代碼嗎?只有文字描述,這樣很難理解問題在那。
  1.                 SPI0->SSR.SSR = 1;                                                                                        //SPI0_SS0 active
  2.                 SPI0->CNTRL.TX_BIT_LEN = 8;                        //Set length of TX and RX       
  3.                 SPI0->TX[0] = 0xF0; //Store data into TX buffer                              
  4.                 SPI0->CNTRL.GO_BUSY=1;                                                                                 //Start TX and RX
  5.                 while(SPI0->CNTRL.GO_BUSY);                                                                        //Check busy
  6.                 SPI0->SSR.SSR = 0;                                                                                        //SPI0_SS0 inactive
  7.                 DrvSYS_Delay(10000);

发送SPI的部分
 楼主| niuyaliang 发表于 2014-2-17 12:41 | 显示全部楼层
  1. #include "SPI_CS5532.h"

  2. void SPI_Init(void)
  3. {
  4.         //配置SPI0的四根线为特殊功能模式,还有一个位决定,但那个复位后默认为0,不配置
  5. SYS->GPCMFP.SPI0_SS0_I2SLRCLK = 1;
  6. SYS->GPCMFP.SPI0_CLK_I2SBCLK  = 1;
  7. SYS->GPCMFP.SPI0_MISO0_I2SDI = 1;
  8. SYS->GPCMFP.SPI0_MOSI0_I2SDO  = 1;
  9.         //使能SPI0的时钟
  10. SYSCLK->APBCLK.SPI0_EN = 1;
  11.         //设置SPI0的时钟频率,有公式可以计算,这里设置为1MHZ,时钟频率的构成由VARCLK_EN位决定
  12. SPI0->DIVIDER.DIVIDER = 5;
  13.         //由于复位后默认为主机模式,不予以配置,这里配置
  14. SPI0->CNTRL.SLAVE = 0;
  15.   //从机选择的配置
  16.         //禁用自动从机选择   从机选择是下降沿触发(默认边沿触发)   激活SS0的状态
  17. SPI0->SSR.AUTOSS = 0;
  18. SPI0->SSR.SS_LVL = 0;
  19. SPI0->SSR.SSR = 1;

  20. //时钟空闲为高电平       
  21. SPI0->CNTRL.CLKP = 1;
  22. //在下降沿改变发送数据信号
  23. SPI0->CNTRL.TX_NEG = 0;       
  24. //在下降沿改变锁存数据信号
  25. SPI0->CNTRL.RX_NEG = 1;       
  26. //设定一次字传输为8位
  27. SPI0->CNTRL.TX_BIT_LEN = 0x08;
  28. //设定LSB优先发送
  29. SPI0->CNTRL.LSB = 1;
  30.        
  31. }
SPI的初始化部分
 楼主| niuyaliang 发表于 2014-2-17 12:42 | 显示全部楼层
  1.                 while(SPI0->CNTRL.GO_BUSY == 0)//当SPI数据传输完毕时
  2.                 {
  3.                         printf("GO_BUSY is %x \n",SPI0->CNTRL.GO_BUSY);
  4.                         printf("TX_EMPTY is %x \n",(SPI0->CNTRL.RESERVE1)&0x04);
  5.                         SPI0->TX[0] = 0x01;//把数据写入tx缓冲中
  6.                         printf("TX_EMPTY is %x \n",(SPI0->CNTRL.RESERVE1)&0x04);
  7.                         SPI0->CNTRL.GO_BUSY = 1;//此位写一开始数据传输
  8.                         printf("GO_BUSY is %x \n",SPI0->CNTRL.GO_BUSY);
  9.                        

  10.                 }
主函数中循环发送数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

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