This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5529:使用PGA116进行编程和通信

Guru**** 1641220 points
Other Parts Discussed in Thread: MSP430F5529, PGA116
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/572250/msp430f5529-programming-and-communicating-with-pga116

部件号:MSP430F5529
在线程中讨论的其他部件: PGA116

如何从MSP430f5529与PGA116通信以设置PGA116的增益?

PGA116由 微控制器(3.3V)提供DVdd电源,CS,DOUT,DIN和SCLK由相应的微控制器引脚提供,使能引脚也保持高连接到3.3V。

如何将16位数据从微控制器的主输出引脚发送到PGA116的DIN引脚?

如何访问PGA116中的寄存器?

以下程序用于初始化SPI时钟,传输和接收数据

 

#include <MSP4S.h>

unsigned char MST_Data,MST_Data2,SLV_Data;
无符号字符temp;

内部主(无效)

易失性无符号int I;

WDTCTL = WDTPW+WDTHOLD;//停止看门狗计时器

P4OUT |= 0x02;//为LED设置WFP 1.0
//设置为从属设备重置的WFP 1.1
P1DIR |= 0x01;//将WFP 1.0 -2设置为输出方向
P4DIR |= 0x02;
P3SEL || BIT3+BIT4;// WFP 3.3 ,4选项选择
P2SEL || BIT7;// WFP 2.7 选项选择

UCA0CTL1 |= UCSWRST;//**将状态机置于复位**
UCA0CTL0 || UCMST+UCSYNC+UCCKPL+UCMSB;// 3引脚,8位SPI主控制器
//时钟极性高,MSB
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 = 0x02;///2
UCA0BR1 = 0;//
UCA0MCTL = 0;//无调制
UCA0CTL1 &=~UCSWRST;//**初始化USCI状态机**
UCA0IE |= UCRXIE;//启用USI_A0 RX中断

P4OUT &=~0x02;//现已初始化SPI信号,
P4OUT |= 0x02;//重置从属设备

对于(i=50;i>0;i--);//等待从属设备初始化

MST_Data = 0x00;// 第一个字节
MST_Data2 = 0xA6;//第二字节
SLV_Data = 0x00;//

同时(!(UCA0IFG&UCTXIFG);// USI_A0 TX缓冲器就绪?
UCA0TXBUF = MST_Data;//传输第一个字符

__bis_sr_register(LPM0_bits + GIE);// CPU关闭,启用中断
}

#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USI_A0_vector
__interrupt void USI_A0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_A0_vector))) USI_A0_ISR (void)
#否则
错误编译器不受支持!
#endif

易失性无符号int I;

Switch(__偶 数_in_range(UCA0IV,4))

情况0:中断;//矢量0 -无中断
案例2://矢量2 - RXIFG
同时(!(UCA0IFG&UCTXIFG);// USI_A0 TX缓冲器就绪?
SLV_Data=UCA0RXBUF;
IF (UCA0RXBUF==SLV_Data)//测试接收的字符是否正确
P1OUT |= 0x01;//如果正确,则指示灯亮起
否则
P1OUT &=~0x01;//如果不正确,请清除LED

// MST_Data++;//增量数据
// SLV_Data++;
UCA0TXBUF = MST_Data;//传输第一个字节
同时(!(UCA0IFG&UCTXIFG));
UCA0TXBUF = MST_Data2;//传输第二个字节

while ((UCA0STAT&BIT0));//检查传输
对于(i=20;I>0; I--);//将两次传输之间的时间添加到
//确保从属设备可以处理信息

中断;
案例4:中断;//矢量4 - TXIFG
默认值:中断;
}
}

 

我是MSP编程新手,提前感谢您

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请查看PGA116数据表的图1,2,56和62以及表2,以进一步了解此从属设备预期的SPI序列。 通信过程中必须将CS引脚驱动至低电平,然后释放,以便PGA116正确响应。 您的时钟相位和极性设置根据模式1正确,1但您需要确保您了解这种情况的原因。 每条读/写命令至少需要2个传输字节,您只需在进入LPM模式之前发送一个字节,而唯一的唤醒是RXIFG,因此设备将不会响应,MCU无法恢复操作。 请进一步查看MSP用户指南的USCI SPI部分以及提供的示例,以更好地了解如何成功完成通信。 您应该使用示波器或逻辑分析器来评估您的SPI通信线路,以确保按预期控制它们。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢您先生,

    CS驱动低,

    给出写命令2A,数据11作为2A11和读取命令6A00 (参考数据表),

    尝试以两个字节的形式逐个连续发送16位,

    启用接收中断(如果接收到数据,则转到存储在变量中的ISR数据),

    给出读取命令后,PGA将发送8位数据,PGA数据分配给SLV数据和SLV数据2 ,因为8位数据在8位延迟后发送。

    但是,无论发送什么数据,这两个SLV数据都将读取255个数据。

    请就如何向PGA发送16位数据命令和接收数据提供建议

     

    #include <MSP4S.h>

    无符号字符MST_Data,MST_Data2,SLV_Data,SLV_Data2,MST_Data_r,MST_Data_R2;

    无符号字符temp;  

    内部主(无效)

     易失性无符号int I;

     WDTCTL = WDTPW+WDTHOLD;                  //停止看门狗计时器

     P4OUT |= 0x02;                           //将WFP 4.1 设置为重置/设置从属设备

     P1DIR |=0x01;                           //将WFP 1.0 设置为输出方向

     P4DIR |= 0x02;                           //将WFP 4.1 设置为输出方向

     P3SEL || BIT3+BIT4;                      // WFP 3.3 ,4选项选择

     P2SEL || BIT7;                           // WFP 2.7 选项选择

     

     UCA0CTL1 |= UCSWRST;                     //**将状态机置于复位**

     UCA0CTL0 || UCMST+UCSYNC+UCCKPL+UCMSB;   // 3引脚,8位SPI主控制器

                                               //时钟极性高,MSB

     UCA0CTL1 |= UCSSEL_2;                    // SMCLK

     UCA0BR0 = 0x02;                          ///2

     UCA0BR1 = 0;                             //

     UCA0MCTL = 0;                            //无调制

     UCA0CTL1 &=~UCSWRST;                    //**初始化USCI状态机**

     UCA0IE |= UCRXIE;                        //启用USI_A0 RX中断

     P4OUT (低)=~0x02;                          // WFP 4.1 SET ACTIVE LOW (低)

     

     对于(i=50;i>0;i--);//                       等待从属设备初始化

     

     MST_Data = 0x11;                         //在PGA 2A11中写入命令

     MST_Data2 = 0x2A;                        // 01是数据

     MST_Data_r=0x00;                         //在PGA 6A00中读取命令

     MST_Data_R2= 0x6A;

     SLV_Data = 0x00;                         //

     SLV_Data2 = 0x00;

     同时(!(UCA0IFG&UCTXIFG);              // USI_A0 TX缓冲器就绪?

     UCA0TXBUF = MST_Data2;              //在PGA上写入,发送更高的字节2A

     UCA0TXBUF = MST_Data;                     //正在发送11.

     同时(!(UCA0IFG&UCTXIFG);              // USI_A0 TX缓冲器就绪?

     UCA0TXBUF = MST_Data_R2;            //在PGA上读取命令,发送更高字节6A

     UCA0TXBUF = MST_Data_r;                    //正在发送00

     __bis_sr_register(LPM0_bits + GIE);      // CPU关闭,启用中断

    }

     

    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)

    #pragma vector=USI_A0_vector

    __interrupt void USI_A0_ISR(void)

    #Elif已定义(__GMNU__)

    void __attribute__((interrupt (USI_A0_vector))) USI_A0_ISR (void)

    #否则

    错误编译器不受支持!

    #endif

     易失性无符号int I;

     Switch(__偶 数_in_range(UCA0IV,4))

     {

       情况0:中断;                         //矢量0 -无中断

       案例2:                                //矢量2 - RXIFG

         while (!(UCA0IFG&UCRXIFG));//          USI_A0 RX缓冲器就绪

         while ((UCA0STAT&BIT0));

         对于(i=20;I>0; I--);               //将两次传输之间的时间添加到

         SLV_Data=UCA0RXBUF;                  //要从从属设备接收16位数据,

         SLV_Data2=UCA0RXBUF;                 //接收第二个8字节

         中断

       案例4:中断;                         //矢量4 - TXIFG

       默认值:中断

     }

    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果不确保TX缓冲区已清空且已准备好处理另一个字节,则不能连续两次写入UCA0TXBUF。 您很可能只发送了预期字节数的一半。 尽管您现在设置了CS LOW (CS低),但我看不到它在完成通信序列后返回到HIGH (高)状态。 您确实需要使用示波器或逻辑分析器来直观地表示SPI线路,以便正确调试系统。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如所说,我查看了时钟信号,数据传输和CS信号,

    从现在起,正在尝试修正变速器侧信号。 现在,在主功能中,我检查TX缓冲器就绪,发送第一个字节,第二个字节仅在ISR中发送,我可以查看16位时钟信号,数据以同步方式发送,如PGA 116数据表中所示(图62,模式1,1)。

    在发送数据之前,CS会被设置为低值,在发送两个字节并 检查传输缓冲区准备就绪之后,CS会设置为高值。 但CS信号是时钟脉冲之前的3个时钟周期。 附图。

    主功能和ISR中的代码如下所示,

    内部主(无效)

    易失性无符号int I;

    WDTCTL = WDTPW+WDTHOLD;//停止看门狗计时器


    P2DIR || BIT3;//芯片选择
    P3SEL || BIT3+BIT4;// WFP 3.3 ,4选项选择
    P2SEL || BIT7;// WFP 2.7 选项选择

    UCA0CTL1 |= UCSWRST;//**将状态机置于复位**
    UCA0CTL0 || UCMST+UCSYNC+UCCKPL+UCMSB;// 3引脚,8位SPI主控制器
    //时钟极性高,MSB
    UCA0CTL1 |= UCSSEL_2;// SMCLK
    UCA0BR0 = 0x02;///2
    UCA0BR1 = 0;//
    UCA0MCTL = 0;//无调制
    UCA0CTL1 &=~UCSWRST;//**初始化USCI状态机**
    UCA0IE |= UCRXIE;//启用USI_A0 RX中断

    P2OUT &=~BIT3;//现已初始化SPI信号,
    P2OUT |= BIT3;//重置从属设备

    对于(i=50;i>0;i--);//等待从属设备初始化

    MST_Data = 0x2A;//初始化数据值
    MST_Data1=0x01;
    SLV_Data = 0x00;//

    同时(!(UCA0IFG&UCTXIFG);// USI_A0 TX缓冲器就绪?

    UCA0TXBUF = MST_Data;//传输第一个字符


    __bis_sr_register(LPM0_bits + GIE);// CPU关闭,启用中断
    }

    ISR下的代码


    易失性无符号int I;

    Switch(__偶 数_in_range(UCA0IV,4))

    情况0:中断;//矢量0 -无中断
    案例2://矢量2 - RXIFG

    P2OUT &=~BIT3;CS低  
    UCA0TXBUF = MST_Data;
    同时(!(UCA0IFG&UCTXIFG));
    UCA0TXBUF = MST_Data1;
    同时(!(UCA0IFG&UCTXIFG));
    P2OUT |=BIT3;CS高

    对于(i=20;I>0; I--);//将两次传输之间的时间添加到
    //确保从属设备可以处理信息
    中断;
    案例4:中断;//矢量4 - TXIFG
    默认值:中断;
    }
    }

    建议 如何使CS信号与时钟脉冲同步

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    while (!(UCA0IFG&UCTXIFG));循环不表示SIMO行上的字节已完全发出,而只是UCA0TXBUF已被清空并且能够存储新字节。 这样就可以在整个字节由USCI状态机发送之前更改P2OUT的状态。 您应该检查UCBUSY位或添加额外的延迟,然后再将CS设为高。 您还错误地使用了RXIFG ISR,因为它应保留用于接收字节,传输应在主功能中处理。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正常,但传输两个字节:

    同时(!(UCA0IFG&UCTXIFG));

    传输MST数据

    同时(!(UCA0IFG&UCTXIFG));

    传输MST数据1

     1) main函数中的语句只发送8位数据,带有8个时钟脉冲。 是否可以使用循环发送两个字节或任何其他方法

    2)我可以在主功能中使用传输中断启用,而不使用RXIFG ISR。

    谢谢你

    Vaishnavi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您需要显示上述仅发送一个字节的代码的示波器屏幕截图。 您可以使用TXIFG ISR发送第二个字节,因为该标志将指示第一个字节已发出,UCA0TXBUF为空,可以用另一个字节填充,但当简单的while循环足够时,这似乎是多余的。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的先生,正如前面所说,检查UCBUSY位有助于在时钟信号结束时纠正CS。 我已经附上了示波器的示波器屏幕截图,其中显示了一个字节和两个字节,现在我通过TXIFG ISR发送了这些字节,甚至一个字节我只能通过ISR发送, 但以下陈述也将在主要功能中给出,我理解为与它的调用ISR类似(如果被误解,请更正)

    同时(!(UCA0IFG&UCTXIFG);// USI_A0 TX缓冲器就绪?
    UCA0TXBUF = MST_Data

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在答复Ryan Brown1时:
    我想通过SPI发送和接收数据到PGA 116,现在我知道我需要发送3-16位数据(6字节)写入命令,读取命令和虚拟16位命令。在发送虚拟16位命令时,PGA将发送其数据。 (根据数据表)。 (如果理解错误,请更正),以实现Tx ISR中具有6个计数的环路。

    P1OUT &=~BIT3;
    用于(i=0;i<6;i++)

    同时(!(UCA0IFG&UCTXIFG));
    UCA0TXBUF = MST_Data[I];
    同时(!(UCA0IFG&UCRXIFG));
    SLV_Data[i]=UCA0RXBUF;
    }
    while ((UCB0STAT&BIT0));
    P1OUT |=BIT3;
    ---------
    在Main函数中调用以下语句:

    同时(!(UCA0IFG&UCTXIFG);// USI_A0 TX缓冲器就绪?
    UCA0TXBUF = MST_Data[0];

    未获得任何时钟信号和脉冲。 建议如何实施?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在USCI ISR内部,不应实施while循环来发送和接收多个字节。

    此致,
    Ryan