在线情况
楼主
  • 头像
  • 级别
    • 积分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
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    [P]好心楼主有点专业行为,编辑原贴删除你的“[B]要命啊,跪求[/B]”吧[EM03]。这样的贴子描述不会增加回复的机率的。[/P][P]为啥没看到有中断服务程序的?如果有用到中断,得必须有这段代码。[/P][P]你可以选择一个可靠的时钟作为时钟源,以保持时钟一定有效的。比如ACLK。[/P][P]IO口设置是否正确,初始化后,使程序不断有数据输出,用示波器测量其输出引脚是否有信号存在。[/P]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分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]
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
        • 积分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]
        微控网感谢您的参与
        在线情况
        5
        • 头像
        • 级别
        • 门派
        • 职务总版主
        • 声望+9
        • 财富5
        • 积分3065
        • 经验390701
        • 文章6744
        • 注册2006-03-07
        实在不行,你换个 while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? 试试,未必一定要用“[FACE=Helvetica][SIZE=3]TXEPT[/SIZE][/FACE]”位,不过这样的SPI读入写出是个非常简单的操作才啊。
        看样子,你也不太像MSP430新手啊~,你的程序我也大概看过,还真没发理有什么问题呢。
        硬件方面没问题?我想你也应该想过了。还是你的“[COLOR=#2b2bd5]ADS_SCLK + ADS_Din + ADS_Dout[/COLOR]”定义有误?估计也不会吧。
        [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
        在线情况
        6
        • 头像
        • 级别
          • 积分12
          • 经验377
          • 文章32
          • 注册2010-09-06
          呵呵,谢谢版主大人。[P]我再试试,然后找个示波器去看看有没有数据发出去。[/P][P]手头没示波器,麻烦啊。[/P]
          微控网感谢您的参与
          在线情况
          7
          • 头像
          • 级别
            • 积分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]
            微控网感谢您的参与
            在线情况
            8
            • 头像
            • 级别
              • 积分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]
              微控网感谢您的参与
              在线情况
              9
              • 头像
              • 级别
              • 门派
              • 职务总版主
              • 声望+9
              • 财富5
              • 积分3065
              • 经验390701
              • 文章6744
              • 注册2006-03-07
              关于这个“TXTEPT”位我暂还想不起是啥关系。
              但是于你后面的这个问题: 无数据里头当然是呈现出为0了,但不意味着他将一直向外发数据。只有在写TXBUF写入一字节操作后,这串口模块就会完成一个向外发送8位数据的操作过程。发完后就表示缓冲器中为空。一个写操作,代表一次发送输出的过程。只有这过程时SI、SCLK上才能呈现出有数据来。
              最基本,你对TXBUF执行一次写操作,不管是啥,SCLK的引脚上一定会有时钟输出的。你可以测测这个特征以确定是否设置成功。
              [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
              在线情况
              10
              • 头像
              • 级别
                • 积分12
                • 经验377
                • 文章32
                • 注册2010-09-06
                DC真是好人,真热心啊。!!![P]
                [/P][P]还有点困惑:串口通讯跟下位机有关系么,就是说 如果主机TXBUF里放了个数据,然后从第7位(高位)发送,从机中途通讯中断,主机第0位发送完毕后,这时应该就认为是发送完了吧????[/P][P]
                [/P]
                微控网感谢您的参与
                在线情况
                11
                • 头像
                • 级别
                • 门派
                • 职务总版主
                • 声望+9
                • 财富5
                • 积分3065
                • 经验390701
                • 文章6744
                • 注册2006-03-07
                主机只负责向串行口输出数据,主机只管自己的数据是否输出完,输出则发送标志位为1,如果还在发中,则为0。
                而接收的,这里又分主接收和从接收。对于MCU的用户来说,用户的单片机一般为主机。从机只要接收到有时钟变化时,数据将会从从机的SI信号移至内部的移位寄存器中。每一位时钟对应着一位数据。
                [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
                在线情况
                12
                • 头像
                • 级别
                  • 积分12
                  • 经验377
                  • 文章32
                  • 注册2010-09-06
                  我知道哪里错了。。谢谢版主了。[P]我犯2了。 选择的是软件模拟。 真郁闷了[/P]
                  微控网感谢您的参与
                  Powered by LeadBBS 9.2 .
                  Page created in 0.1875 seconds with 5 queries.