SPI波形出问题

[复制链接]
4961|6
 楼主| jakill 发表于 2012-11-13 17:16 | 显示全部楼层 |阅读模式
使用的是s3c2440开发板的引出脚,SPI的MOSI为主输出,MISO为主输入,只有主机发送,这里测发送的波形,以及SCLK 和SEN(nSS)使能引脚的波形测得的波形出问题了
波形如下

下面是代码。不晓得哪里出错了哦
  1. #include "uart.h"
  2. #include "adc.h"
  3. //#include "ucos.h"
  4. #include "2440addr.h"
  5. #include "stdarg.h"
  6. #include "def.h"

  7. /* 无线模块1 */
  8. #define MISO0 11 /* GPE11:SPI输入  */
  9. #define GET_MISO0() ((rGPEDAT & (1<<MISO0)) >> MISO0)
  10. #define MOSI0 12 /* GPE12:SPI输出  */
  11. #define SET_MOSI0(value) (rGPEDAT = (rGPEDAT & ~(1<<MOSI0)) | (value<<MOSI0))
  12. #define SCK0  13 /* GPE13:SPI输出  */
  13. #define SET_SCK0(value) (rGPEDAT = (rGPEDAT & ~(1<<SCK0)) | (value<<SCK0))
  14. #define CE0   14 /* GPG14:数字输出 */
  15. #define SET_CE0(value) (rGPGDAT = (rGPGDAT & ~(1<<CE0)) | (value<<CE0))
  16. #define GET_CE0() ((rGPGDAT & (1<<CE0)) >> CE0)
  17. #define CSN0  2  /* GPG2: SPI输出  */
  18. #define SET_CSN0(value) (rGPGDAT = (rGPGDAT & ~(1<<CSN0)) | (value<<CSN0))
  19. #define IRQ0  13 /* GPG13: 中断输入 */
  20. #define GET_IRQ0() ((rGPFDAT & (1<<IRQ0)) >> IRQ0)

  21. /* 无线模块2 */
  22. #define MISO1 5  /* GPG5:SPI输入  */
  23. #define GET_MISO1() ((rGPGDAT & (1<<MISO1)) >> MISO1)
  24. #define MOSI1 6  /* GPG6:SPI输出  */
  25. #define SET_MOSI1(value) (rGPGDAT = (rGPGDAT & ~(1<<MOSI1)) | (value<<MOSI1))
  26. #define SCK1  7  /* GPG7:SPI输出  */
  27. #define SET_SCK1(value) (rGPGDAT = (rGPGDAT & ~(1<<SCK1)) | (value<<SCK1))
  28. #define CE1   0  /* GPG0:数字输出 */
  29. #define SET_CE1(value) (rGPGDAT = (rGPGDAT & ~(1<<CE1)) | (value<<CE1))
  30. #define GET_CE1() ((rGPGDAT & (1<<CE1)) >> CE1)
  31. #define CSN1  3  /* GPG3: SPI输出  */
  32. #define SET_CSN1(value) (rGPGDAT = (rGPGDAT & ~(1<<CSN1)) | (value<<CSN1))
  33. #define IRQ1  11 /* GPG11: 中断输入 */
  34. #define GET_IRQ1() ((rGPGDAT & (1<<IRQ1)) >> IRQ1)


  35. void delay(int t)
  36. {
  37.         for(;t>0;t--);
  38.        

  39. }
  40. static void usDelay(U32 uSeconds, void __irq (*PwmIsr)(void)) {
  41.     // set ISR for PWM Timer 4
  42.     if (PwmIsr != NULL) {
  43.         ClearPending(BIT_TIMER4);
  44.         pISR_TIMER4 = (U32) PwmIsr;
  45.         EnableIrq(BIT_TIMER4);
  46.     }

  47.     // timer input clock frequency = PCLK / (24 + 1) / 2 = 1 MHz
  48.         rTCFG0 &= ~(0xff << 8);   // clear TCFG0[15:8](Prescaler 1) to 0
  49.         rTCFG0 |= 24 << 8;                  // Prescaler 1 = 24
  50.         rTCFG1 &= ~(0xf << 16);   // clear TCFG1[19:16](MUX 4) to 0
  51.         rTCFG1 |= 0 << 16;                  // MUX 4 = 0000 = 1/2

  52.         rTCNTB4 = uSeconds;       // use PWM Timer 4, the initial count value is uSeconds
  53.         rTCON &= ~(0x7 << 20);    // clear TCON[22:20] to 0
  54.         rTCON |= 0x0 << 22;                  // one-shot
  55.         rTCON |= 0x1 << 21;       // manula update TCNTB4
  56.         rTCON |= 0x1 << 20;       // start for Timer 4
  57.         rTCON &= ~(0x1 << 21);          // clear TCON[21](Timer 4 Manual Update) to zero
  58.        
  59.         while(rTCNTO4)
  60.             ;
  61. }

  62. static void InitSpi(void) {
  63.     // 设置时钟控制寄存器(CLKCON),使能SPI时钟
  64.     rCLKCON = (rCLKCON & ~(1 << 18)) | (1 << 18);
  65.    
  66.     // SPI0为主设备
  67.     // 初始化GPE GPE11:MISO0(MISO);GPE12:MOSI0(MOSI);GPE13:SPICLK0(SCK)
  68.     rGPECON = (rGPECON & ~(3 << MISO0 * 2 | 3 << MOSI0 * 2 | 3 << SCK0 * 2)) |
  69.         (2 << MISO0 * 2 | 2 << MOSI0 * 2 | 2 << SCK0 * 2);
  70.     // 初始化GPG GPG13:GPG2: nSS_SPI0(CSN),配置为输出
  71.     rGPGCON = (rGPGCON & ~(3 << CSN0 * 2)) | (1 << CSN0 * 2);
  72.     rGPGUP &=~(1<<2);
  73.     // 设置波特率预定标器寄存器(SPPREn),波特率 = PCLK / 2 / (预定标器值 + 1) = 1MHz
  74.     rSPPRE0 = 0x18;
  75.     // 设置SPCONn寄存器以正确配置SPI模块
  76.     // normal; format A; active high; master; enable; polling mode
  77.     //1<<1,CPHA=1;0<<2,CPOL=0,
  78.     rSPCON0 = (rSPCON0 & ~(1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 3 << 5)) |
  79.         (0 << 0 | 1 << 1 | 0 << 2 | 1 << 3 | 1 << 4 | 0 << 5);
  80.     // 设置SPI引脚控制寄存器(SPPINn)
  81.     // Release; Disable (general purpose)
  82.     rSPPIN0 = (rSPPIN0 & ~(1 << 0 | 1 << 2)) | (0 << 0 | 0 << 2);
  83. }

  84. static char Spi0Transfer(char uch1) {
  85.     char temp;
  86.     while(!(rSPSTA0&0x01));

  87.         // 将nSS(CSN)引脚设为低电平,激活SPI模块
  88.         //上面是原文,这里因为SL900A是高电平才有效
  89.         //所以这里是设置为高电平,激活SPI模块。
  90.     SET_CSN0(1);
  91.     delay(5);
  92.    // usDelay(1, NULL);
  93.                 
  94.     // 发送流程,若uch不为NULL,则开始发送;若uch为NULL,则自动发送哑数据
  95.    // if (uch1 != NULL)
  96.         rSPTDAT0 = uch1;
  97.   //  else
  98.      //   rSPTDAT0 = 0xFF;
  99.     // 判定SPSTAn寄存器的REDY标志

  100.     while (!(rSPSTA0 & 0x01))
  101.         ;
  102.     // 接收流程,初始化时已经配置为TAGD位,没有数据发送时自动发送哑数据
  103.     temp = rSPRDAT0;
  104.                 
  105.         // 将nSS(CSN)引脚设为高电平,关闭SPI模块
  106.         SET_CSN0(0);
  107.         delay(5);
  108.         //usDelay(1, NULL);
  109.        
  110.         return temp;
  111. }



  112. void Main(void)
  113. {
  114.         unsigned char i,uiRcvData;
  115.     unsigned char const uiBuf[8] = {0x66, 0x00, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0xff};
  116.    
  117.     Uart0_Init(115200);
  118.     InitSpi();
  119.    
  120.    
  121.    
  122.    /*
  123.           while (1) {
  124.                 for (i = 0; i < 8; i++){                                                                               
  125.                         Spi0Transfer(uiBuf[1]);
  126.                         uiRcvData = Spi0Transfer(NULL);
  127.                         Uart_Printf("\n Master: 0x%x\n", uiRcvData);
  128.                 }
  129.                 usDelay(1000, NULL);
  130.         }
  131.         */

  132.         while(1)
  133.         {
  134.                 Spi0Transfer(uiBuf[3]);
  135.                 Spi0Transfer(uiBuf[4]);
  136.                 //Uart0_Printf("i=%d\n",i);
  137.                 //usDelay(1000, NULL);
  138.                
  139.                
  140.                
  141.         }
  142. }

本帖子中包含更多资源

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

×
 楼主| jakill 发表于 2012-11-13 17:17 | 显示全部楼层
知道的大神帮忙看看哈
在这谢过了
阿南 发表于 2012-11-13 20:26 | 显示全部楼层
使能管脚是低电平有效吗?
 楼主| jakill 发表于 2012-11-14 09:09 | 显示全部楼层
3# 阿南 使能管脚是高电平有效
jlass 发表于 2012-11-14 09:13 | 显示全部楼层
你的图画的靠谱吗?
mosi是输出引脚,怎么会出现没有数据的情况?
另外,你确定使能引脚是高有效的吗?
zjwyczj 发表于 2012-12-6 13:31 | 显示全部楼层
SPI应该很简单啊,你看看控制寄存器有没设置错,极性,相位,发生的数据位数(16/8bit),然后发送数据:片选,等待发生寄存器空,写数据。就OK了,看你发送数据时候还有延时啥的??没必要吧。你在好好检查检查
王晓堃215 发表于 2012-12-17 10:17 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

1

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