在线情况
楼主
  • 头像
  • 级别
    • 积分12
    • 经验377
    • 文章32
    • 注册2010-09-06
    SPI同步通讯建立不起来,求高手指点!
    [FACE=Courier New][FACE=宋体][LINE-HEIGHT=19px][SIZE=14px]串口同步通讯的声明:[/FACE][/LINE-HEIGHT][/FACE][/SIZE][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]// 初始化MSP430的SPI[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]// SPI时钟选择DCOCLK最高频率,在8M-10M之间;因外部XT2=8M晶振,故选用外部晶振[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]void Init_SPI(void)[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]{[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]//  BCSCTL1_ |= RSEL0 + RSEL1 + RSEL2;     // 选择最高标称频率[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]//  DCOCTL_  |= DCO0 + DCO1 + DCO2;      [/FACE][/LINE-HEIGHT] // Set max DCO frequency      [/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]//  BCSCTL2_ &= ~SELS;      [/FACE][/LINE-HEIGHT]                 // SMCLK选择DCOCLK时钟源[/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]
    [/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  U0CTL = CHAR + SYNC + MM + SWRST;     // 8-bit, SPI, Master,Software reset enable[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  U0TCTL = SSEL0 + SSEL1 + STC;          // 在USCLK时钟的下降沿输出,上升沿锁存[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  U0BR0  = 0x002;                        // SPICLK = SMCLK/2[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  U0BR1  = 0x000;[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  U0MCTL = 0x000;                        // 同步通信时不需要调整寄存器,使用时最好全写0[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  ME1 = USPIE0;                          // SPI模块0允许[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  U0CTL &= ~SWRST;                      // SPI允许[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  [/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  // IE1 |= URXIE0;                      // 接收中断允许[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]  // _EINT();                            // 允许中断      [/FACE][/LINE-HEIGHT][/COLOR][/SIZE][/P][FACE=Courier New][COLOR=#3352cc][LINE-HEIGHT=19px][SIZE=14px]
    }[/FACE][/LINE-HEIGHT][/COLOR][/SIZE][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif]已经查了好多遍,我认为声明是没有错误的。。[/FACE][/LINE-HEIGHT][/SIZE][/BGCOLOR][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif]
    [/FACE][/LINE-HEIGHT][/SIZE][/BGCOLOR][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif]然后用串口通讯发送一个字节:[/FACE][/LINE-HEIGHT][/SIZE][/BGCOLOR][FACE=monospace][SIZE=14px]  [/FACE][/SIZE][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=monospace][COLOR=#3333cc] U0TXBUF =WriteData;// Send the byte    [/FACE][/SIZE][/LINE-HEIGHT][/BGCOLOR][/SIZE][/FACE][/COLOR][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=monospace][COLOR=#3333cc] while(!(U0TCTL & TXEPT));   // TX Buffer is empty ?[/FACE][/SIZE][/LINE-HEIGHT][/BGCOLOR][/SIZE][/FACE][/COLOR][/P][P][FACE=宋体][SIZE=9pt][/FACE][/SIZE][/P][P][FACE=宋体][SIZE=9pt][/FACE][/SIZE][/P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px]while(!(U0TCTL & TXEPT)); [COLOR=#e61a94][b]程序在这句 死循环!!!!![/b][/FACE][/SIZE][/BGCOLOR][/SIZE][/COLOR][LINE-HEIGHT=22px][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][/FACE][/SIZE][P][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][/LINE-HEIGHT][/BGCOLOR][/SIZE][/P][P][/P][P][/P][P][/P][P][ALIGN=left][LINE-HEIGHT=22px][P][LINE-HEIGHT=normal][/LINE-HEIGHT][/P][P][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif]这个地方U0TCTL的TXEPT位 跟踪发现,总是0,也就是说 总是有数据,在没有U0TXBUF = WriteData时候也是0[/FACE][/LINE-HEIGHT][/P][/LINE-HEIGHT][/ALIGN][/P][P][/P][P][/P][P][/P][/BGCOLOR][/SIZE][/LINE-HEIGHT][P][FACE=宋体][SIZE=9pt][/FACE][/SIZE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif]
    [/FACE][/LINE-HEIGHT][/SIZE][/BGCOLOR][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif]个人感觉,U0TCTL的TXEPT位 应该在未发送数据前为1(空),然后U0TXBUF有值时 该位变为0,发送完毕,该位变为1;[/FACE][/LINE-HEIGHT][/SIZE][/BGCOLOR][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif]求高手指点啊,我的理解有问题么,然后没问题的话 我这会是什么问题呢?[/FACE][/LINE-HEIGHT][/SIZE][/BGCOLOR][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][FACE=Helvetica, Arial, sans-serif]
    [/FACE][/SIZE][/BGCOLOR][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif][/FACE][/LINE-HEIGHT][/SIZE][/BGCOLOR][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][BGCOLOR=rgb][SIZE=14px][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif][/FACE][/LINE-HEIGHT][/SIZE][/BGCOLOR][/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt][/FACE][/SIZE][/P][P][FACE=宋体][SIZE=9pt][/FACE][/SIZE][/P][P][FACE=宋体][SIZE=9pt][LINE-HEIGHT=normal][FACE=Helvetica, Arial, sans-serif][/FACE][/LINE-HEIGHT][/SIZE][/FACE][/P][P][/P]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分12
      • 经验377
      • 文章32
      • 注册2010-09-06
      [P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]//初始化系统时钟[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]void InitSystemClock(void)[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]{[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    volatile char i;[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]
      [/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    BCSCTL1 &=~ XT2OFF;            //开启XT2高频晶体振荡器.8M[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]
      [/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    do {[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]      IFG1 &= ~OFIFG;              // Clear OSCFault flag[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]      for (i=0xFF; i>0; i--);      // Time for flag to set[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    } while ((IFG1 & OFIFG));      // OSCFault flag still set? [/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    [/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    BCSCTL2 |= SELM_2 + SELS;      // MCLK = SMCLK = XT2 (safe), MCLK和SMCLK选择高频晶振.[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]}[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]
      [/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#111111][SIZE=12px]这是初始化系统时钟的程序。[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px][/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    // 初始化MSP430与ADS1247的通信端口[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    P3SEL |= ADS_SCLK + ADS_Din + ADS_Dout;           // Setup P3 for SPI mode[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#2b2bd5][SIZE=12px]    P3DIR |= ADS_CS;[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#111111][SIZE=12px]这是端口信息,F169使用P3的0.1.2 阵脚作为外部USART模块的三线(SIM0,SIM1,UCLK)。[/FACE][/COLOR][/SIZE][/P][P][FACE=宋体][COLOR=#111111][SIZE=12px]另外,暂时没用到中断,逻辑暂时是 发送一个指令,然后接受一个数据。[/FACE][/COLOR][/SIZE][/P][P][/P]
      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
        • 积分12
        • 经验377
        • 文章32
        • 注册2010-09-06
        [LINE-HEIGHT=22px][FACE=Helvetica, Arial, sans-serif][BGCOLOR=rgb]调整了下顺序,在未发送数据前 看看 U0TCTL的TXEPT位是否为1(空闲)?[/BGCOLOR][/FACE][/LINE-HEIGHT]
        [LINE-HEIGHT=22px][FACE=Helvetica, Arial, sans-serif][BGCOLOR=rgb][P][LINE-HEIGHT=normal]while(!(U0TCTL & TXEPT)); // TX Buffer is empty ?[/LINE-HEIGHT][/P][/BGCOLOR][/FACE][/LINE-HEIGHT][FACE=Helvetica, Arial, sans-serif][BGCOLOR=rgb]U0TXBUF =WriteData;// Send the byte[/BGCOLOR][/FACE][LINE-HEIGHT=22px][FACE=Helvetica, Arial, sans-serif][BGCOLOR=rgb],

        结果依旧是
        while(!(U0TCTL & TXEPT));
        这里死循环。
        这时候没有发送数据啊,怎么还是走不出来?按理说 U0TCTL的TXEPT不应该是1(空闲)么?[/BGCOLOR][/FACE][/LINE-HEIGHT]
        微控网感谢您的参与
        在线情况
        4
        • 头像
        • 级别
          • 积分12
          • 经验377
          • 文章32
          • 注册2010-09-06
          呵呵,谢谢版主大人。[P]我再试试,然后找个示波器去看看有没有数据发出去。[/P][P]手头没示波器,麻烦啊。[/P]
          微控网感谢您的参与
          在线情况
          5
          • 头像
          • 级别
            • 积分12
            • 经验377
            • 文章32
            • 注册2010-09-06
            用示波器看了,一直有数据[P]然后看sclk,竟然是400K。。我晕,SMLK是8M,SPI波特率是SMLK/2,怎么会是400K。。。[/P][P]
            [/P][P]用了[LINE-HEIGHT=24px][BGCOLOR=rgb]while (!(IFG1 & UTXIFG0));还是死循环。。。[/BGCOLOR][/LINE-HEIGHT][/P]
            微控网感谢您的参与
            在线情况
            6
            • 头像
            • 级别
              • 积分12
              • 经验377
              • 文章32
              • 注册2010-09-06
              另外[LINE-HEIGHT=22px][FACE=Helvetica, Arial, sans-serif][BGCOLOR=rgb]发现在init了SPI后,没有发送数据时候,UTXBUF中是0x00,TXTEPT是0(意思是移位寄存器跟UTXBUF中有数据);[P][LINE-HEIGHT=normal][P][LINE-HEIGHT=normal]我知道这可能是全双工通讯导致的。书上说,全双工,无数据则一直发送空——这个空是不是0x00??[/LINE-HEIGHT][/LINE-HEIGHT][/P][/P][/BGCOLOR][/FACE][/LINE-HEIGHT]
              微控网感谢您的参与
              在线情况
              7
              • 头像
              • 级别
                • 积分12
                • 经验377
                • 文章32
                • 注册2010-09-06
                DC真是好人,真热心啊。!!![P]
                [/P][P]还有点困惑:串口通讯跟下位机有关系么,就是说 如果主机TXBUF里放了个数据,然后从第7位(高位)发送,从机中途通讯中断,主机第0位发送完毕后,这时应该就认为是发送完了吧????[/P][P]
                [/P]
                微控网感谢您的参与
                在线情况
                8
                • 头像
                • 级别
                  • 积分12
                  • 经验377
                  • 文章32
                  • 注册2010-09-06
                  我知道哪里错了。。谢谢版主了。[P]我犯2了。 选择的是软件模拟。 真郁闷了[/P]
                  微控网感谢您的参与
                  Powered by LeadBBS 9.2 .
                  Page created in 0.4375 seconds with 10 queries.