Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all 3634 articles
Browse latest View live

mspexpf5529lp开发板串口通信A0不成功

$
0
0

f5529lp开发板,成功运行rtos里面的uartecho例程。但是把例程中的串口从A1变到A0就进入死循环。

例程里面修改的部分如下:

const UARTUSCIA_BaudrateConfig uartUSCIABaudrates[] = {
/* {baudrate, input clock, prescalar, UCBRFx, UCBRSx, oversampling} */
{
.outputBaudrate = 115200,
.inputClockFreq = 8192000,
.prescalar = 4,
.hwRegUCBRFx = 7,
.hwRegUCBRSx = 0,
.oversampling = 1
},
{9600, 8192000, 53, 5, 0, 1},
{9600, 32768, 3, 0, 3, 0},
};

const UARTUSCIA_HWAttrs uartUSCIAHWAttrs[MSP_EXP430F5529LP_UARTCOUNT] = {
{
.baseAddr = USCI_A0_BASE,
.clockSource = USCI_A_UART_CLOCKSOURCE_SMCLK,
.bitOrder = USCI_A_UART_LSB_FIRST,
.numBaudrateEntries = sizeof(uartUSCIABaudrates)/sizeof(UARTUSCIA_BaudrateConfig),
.baudrateLUT = uartUSCIABaudrates
},
};

const UART_Config UART_config[] = {
{
.fxnTablePtr = &UARTUSCIA_fxnTable,
.object = &uartUSCIAObjects[0],
.hwAttrs = &uartUSCIAHWAttrs[0]
},
{NULL, NULL, NULL}
};

/*
* ======== MSP_EXP430F5529LP_initUART ========
*/
void MSP_EXP430F5529LP_initUART(void)
{
/* P4.4,5 = USCI_A1 TXD/RXD */
//GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P4,
// GPIO_PIN4 | GPIO_PIN5);
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,
GPIO_PIN3 | GPIO_PIN4);
/* Initialize the UART driver */
UART_init();
}

上面的本来是A1的串口,我改为A0,下面管脚改为A0对应的3.3 3.4

其他地方都不做改动。这样跑起来就进入中断不出来

__interrupt Void ti_sysbios_family_msp430_Hwi56(Void)
{
while(1){};
}

哪位大神给支支招。搞了好几天都不行。


MSP430FR5969 SPIA电流变大问题

$
0
0

在近期的测试中发现了一个关于MSP430FR5969在SPI通讯中功耗的问题:将eUSCIA配置为SPI模式(UCCKPH配置为1,UCCKPL配置为0,主机模式,先发高位),每4ms进行一次SPI通讯,此时电流15uA左右(未通讯时处于LPM3低功耗)。在此过程中,当MISO管脚接收的8位数据最低位为1,且通讯结束MISO管脚从1跳变至0时,会发生电流突然变大的状况, MSP430FR5969电流变大至170uA(同样处于低功耗LPM3)。此时,停止SPI通讯后进入LPM3低功耗模式,电流不会减小,同时监测模块UCBUSY 一直在0/1之间跳变,而同等配置下SPIB模块则不会出现上述问题。不知贵公司是否了解该问题?在贵公司MSP430FR5969的勘误手册中,提及到了SPIA模块存在类似问题(问题编号:USCI41),怀疑与该问题有强相关性。

 为明确该问题,我编写了一段简单的测试代码在贵公司的开发板(MSP430FR5969 LaunchPad™ Development Kit)上的最小系统上运行,可以复现之前描述的bug。基本思路是用MSP430FR5969的IO口输出来模拟从机的发送端,连接到430的P2.1即SPI的输入口 (UCA0SOMI)。当SPI接收的8位数据全部为1,SPI通讯结束后,将UCA0SOMI端口通过IO输出拉低,此时MSP430FR5969电流会增大至170uA,同时监测模块UCBUSY 一直在0/1之间跳变。

部分代码:

// MSP430FR5969
// -----------------
// /|\ | P1.3|-> Slave Chip Select (GPIO)
// | | |
// | |
// | P2.0|-> Data Out (UCA0SIMO)
// | |
// | P2.1|<- Data In (UCA0SOMI)
// | |
// | P1.5|-> Serial Clock Out (UCA0CLK)
// | P2.4|-> 串联470K电阻并接P2.1|Data In (UCA0SOMI)

/**********************************************************************
* 函数名称:// asic_spi_writedata
* 功能描述:// 通过spi读asic寄存器数据
* 输入参数:// ASIC寄存器地址
* 输出参数:// 无
* 返 回 值:// 该寄存器地址下数据
* 其它说明:
***********************************************************************/
uint8_t asic_spi_readdata(uint8_t address)
{
uint8_t data = 0;

ASIC_SPI_CLEARCS();
__delay_cycles(100);

while(!(UCA0IFG & UCTXIFG)); //USCI_A0 TX buffer ready?
UCA0TXBUF = address; //发送数据
while(!(UCA0IFG & UCTXIFG));

__delay_cycles(100);
UCA0TXBUF = 0x00; //发送数据
while(!(UCA0IFG & UCTXIFG));

__delay_cycles(100);
while(!(UCA0IFG & UCRXIFG));
data = UCA0RXBUF; //读数据

__delay_cycles(100);
ASIC_SPI_SETCS();
return data;
}

/**********************************************************************
* 函数名称:// void gpio_init_forPowerMeas(void)
* 功能描述:// 功耗测试使用的gpio驱动,将所有端口设为输出,以避免输入悬空对功耗的影响
* 输入参数:// 无
* 输出参数:// 无
* 返 回 值:// 无
* 其它说明:
***********************************************************************/

void gpio_init_forPowerMeas(void)
{
// Configure GPIO
P2SEL0 = 0;
P1SEL1 = ASIC_SCK ;
P1DIR = 0xff;
P1OUT = 0x00;

P2SEL0 = 0;
P2SEL1 = ASIC_MOSI + ASIC_MISO;
P2DIR = 0xff;
P2OUT = 0x00;

P3DIR = 0xff;
P3OUT = 0x00;

P4DIR = 0xff;
P4OUT = 0x00;

PJSEL0 = ACLK_OUT + LFXTIN + LFXTOUT ;
PJSEL1 = 0;
PJDIR |= 0xFF;
PJOUT = 0x00;


// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
PM5CTL0 &= ~LOCKLPM5;
}

/**********************************************************************
* 函数名称:// asic_spi_init
* 功能描述:// UCA0模块 SPI初始化,用于ASIC通讯
* 输入参数:// 无
* 输出参数:// 无
* 返 回 值:// 无
* 其它说明:波特率4M,3线SPI,CS端由IO口模拟
***********************************************************************/
void asic_spi_init(void)
{

//Initialize SPI Master
//Disable the USCI Module
//Reset OFS_UCA0CTLW0 values
UCA0CTLW0 = UCSWRST + UCSSEL__SMCLK;
//Select Clock SMCLK

//Bit clock prescaler setting. fBitClock = fBRCLK / UCBRx
//UCA0BRW = 8000000 / 1000000; //SMCLK 8M,波特率1M
UCA0BRW = 8000000 / 4000000;
/*
* Configure as SPI master mode.
* Clock phase select, polarity, msb
* UCMST = Master mode
* UCSYNC = Synchronous mode
* UCMODE_0 = 3-pin SPI
*/
//Data is changed on the first UCLK edge and captured on the followingedge.
//The inactive state is low.
//3-pin SPI

UCA0CTLW0 |= UCMSB + UCCKPH + UCMST + UCSYNC; //MSB First. capture changge
//Master mode //Synchronous mode

//No modulation
//UCA0MCTLW = 0;
//Enable SPI module
UCA0CTLW0 &= ~UCSWRST;
}

/**********************************************************************
* 函数名称:// int main(void)
* 功能描述:// 1.应用程序的主函数
* 2.实现硬件和软件初始化,工作状态切换,记录复位源
* 输入参数:// 无
* 输出参数:// 无
* 返 回 值:// 无
* 其它说明:// 无
***********************************************************************/
int main(void)
{
cpu_initial();
uint16_t adc_cnt;
WDT_HOLD();

P2OUT |= BIT4; //P2.4管脚470K电阻接P2.1|<- Data In (UCA0SOMI)
adcbuf_v1 = asic_spi_readdata(0x00);
P2OUT &= ~BIT4; //进行读操作后将P2.4管脚置低
do
{
delay_ms(4);

//监测寄存器UCBUSY位,示波器接P3.6
if(UCA0STATW & UCBUSY)
{
P3OUT |= BIT6;
}
else
{
P3OUT &= ~BIT6;
}

}while(1);
}

MSP430 系列MCU編碼原則

$
0
0

您好,

請問有MSP430系列 MCU的命名編碼原則表嗎?

另想請問  MSP430F2370IRHAR  包裝方式同  MSP430F2370IRHAT 嗎?
因為在欄位裡面找不到對應料號.

感謝.

MSP430看门狗寄存器配置,用的4Mhz时钟,8ms便复位

$
0
0

我使用的是外接晶振4MHZ,对MSP430看门狗寄存器进行配置,但是无论怎么设置,8ms过后系统都会复位。

void wdt_init(void)
{
  WDTCTL = WDTPW + WDTCNTCL+WDTSSEL;          //8ms喂狗
  //WDTCTL = 0x6906;  
}


void wdt_clear(void)

    WDTCTL = WDTPW+WDTCNTCL;          //8ms喂狗
    //WDTCTL = 0x6906; 
}

msp-expcc430rf4 出厂例程找不到头文件!

$
0
0

如图,官方给的代码,但是在整个文件夹中都找不到这几个头文件,编译时也显示找不到,哪里可以下载相应的头文件?

MSP-EXPCC430RF4使用例程遇到困难

$
0
0

在msp430ware目录下找到了该开发板的出厂例程的project. 首先我打开.ccsproject 文件反应, 在ccs界面里用导入的方式选择后这个路径是灰的,无法导入。 我只好新建一个project然后直接添加例程的c文件(这样感觉很不靠谱), 然后simpliciti的头文件路径都在include option里设置了。但是编译后还是会很多错误。

1.请问有什么方法可以导入这种project

2.simpliciti是否需要很复杂的去配置?

3.图2中simpliciti文件夹是否需要把头文件的c文件导入?如果导入会出现很多xxxx.obj error.

4.这个开发板是否只能用simpliciti协议?

5.是否有ti官方的qq群之类的能快速得到帮助的在线群组?

谢谢

MSP430G2553 I2C模块读取ADT7410 Chip ID结果不正确

$
0
0

Hi, All !Happy New Year!

在调试MSP430G2553的I2C外设读取ADT7410的CHIP ID时,结果不正确。怀疑是配置错误或配置的顺序不正确。困扰很久了,我需要帮助。

芯片:MSP430G2553

IDE:CCS V7.4

ADT7410是一个2C接口温度传感芯片,同MSP430一样,支持低功耗特性,但在调试期间,我先不考虑能耗优化,先用I2C读取到Chip ID,再做软件设计。ADT7410的设备地址是0x4B,我已经访问到了。Chip ID的寄存器地址是0x0B,Chip ID的是11001XXX(MSB),后三位是芯片版本号,不固定。用我写的代码读取的值是0x0C,也就是说,我读错了。原代码和调试结果如下,请各位工程师帮忙看一眼,看看错在哪了,谢谢!

#include <msp430.h>
#include "msp430g2553.h"
#include "12864_3xian.h"//Function delay1000(DELAY) in this file
#define DELAY  2

void LED2_ON(void);
void LED3_ON(void);
void LED2_OFF(void);
void LED3_OFF(void);

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop Watchdog Timer

  P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  P3DIR |=BIT2+BIT3;//BIT2 BIT3 is LED on Board

  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMST+UCMODE_3+UCSYNC;         // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_2+UCSWRST;              // Use SMCLK, keep SW reset
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0I2CSA = 0x4B;                         // ADT7410 I2C address is 0x4B
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation

  unsigned int temp;

  while (1)
  {

    UCB0CTL1 |= UCTR;//设置为发送模式
    delay1000(DELAY);
    UCB0CTL1 |= UCTXSTT;//先产生起始条件
    UCB0TXBUF = 0x0B;//再往BUF中写入待发送的数据。ADT7410的Chip ID地址是0x0B
    while (UCB0CTL1 & UCTXSTT);//数据发送完成后,UCTXSTT会被置0。即等待直到发送完成。
    UCB0CTL1 |= UCTXSTP;//完成后往总线发送停止条件,结束本次写操作

    //After write ,blanking LED for easy debug
    LED2_ON();
    delay1000(DELAY);
    LED2_OFF();
    delay1000(DELAY);

    UCB0CTL1 &= ~UCTR;//设置为接收模式
    delay1000(DELAY);
    UCB0CTL1 |= UCTXSTT;//先产生起始条件
    while(UCB0CTL1 & UCTXSTT)//等待ADT7410的ACK
    temp = UCB0RXBUF;//读取缓冲区
    UCB0CTL1 |= UCTXSTP;//完成后往总线发送停止条件,结束本次读操作
    delay1000(DELAY);

  }
}

void LED2_ON(void)
{
    P3OUT |=BIT2;
}
void LED3_ON(void)
{
    P3OUT |=BIT3;
}
void LED2_OFF(void)
{
    P3OUT &=~BIT2;
}
void LED3_OFF(void)
{
    P3OUT &=~BIT3;

msp430f5529的U口设计问题

$
0
0

msp430f5529设计一个可以读写U盘的装置,只需要软件设置还是需要在外围加host芯片?如果需要加host芯片,选择什么芯片?谢谢


MSP430F5438A 串口通讯问题

$
0
0

板子上的为MSP430F5438芯片, 设置的DCO 为 10M ,串口波特率设置的115200 ,一帧数据包(10字节),和电脑通讯, 电脑发送什么,主板返回给电脑相同的数据,  先发现大多数情况下,数据是正常的,但是会存在数据丢失的情况, 当数据丢失时,会接收到该帧数据的最后一个字节,请问这是该芯片的特性还是哪里设置不对??   丢帧时,会接收到该帧数据的最后一个字节

MSP430F5438A程序仿真总是跑飞 不能进行仿真 着急!!!

$
0
0

我的产品最近进行硬件升级,CPU采用MSP430F5438A芯片(之前采用的芯片是MSP430F5437),程序也是在之前的MSP430F5437版本的程序移植过来,现在出现的现象是:烧写80块芯片板子,有三分之二的板子程序能够正常跑起来,有大约10块的板子程序总是跑不起来,我用IAR开发平台进行程序仿真发现如下问题:

程序就仿真不了了!

问题:

(1)看现象貌似是堆栈指针跑飞,可以为什么有三分之二的板子又能正常跑呢?

(2)为什么仿真的时候有时候单步它也能正常?

基于CC2541 和 MSP430 的Bluetooth 低能耗键盘参考设计参考软件

MSP430FR6047

$
0
0

官方测试DEMO板程序中是否有按键程序或资料?能否发一下

有没有MSP432401R datasheet中引脚复用具体的说明?

$
0
0

有没有MSP432401R datasheet中引脚复用具体的说明?从简写中我看不懂每个名称具体指的是那种功能?

MSP430F169IPMR

$
0
0

MSP430F169IPMR 我们有收到同一个料不同DC 两个REV 版本号,在原厂标签及芯片本体上的印字上都有标注。一个是REV:D, 另一个是REV:E


我们有向代理商去询问:这两个版本号的区别,以及 E 版本是什么时候生产发行的? 为什么两个版本同时在生产发货? 之前我们一直有的是REV E ,现在使用REV D 是否会有影响?


但是代理商要向原厂去询问,时间很长。我们的产线现在正在等着我的回复,我希望能通过你们得知以上的答案。



MSP430I2021 差分采集

$
0
0

MSP430I2021差分采集输入A0.0+,A0.0-能否作为普通的ADC采集信号使用?如何使用?


关于MSP430断电后从串口窃电的问题

$
0
0

现有msp430fr6972和stm32两套系统,两套系统分别采用两块电池单独供电,中间仅采用三串口线(3.3v) TXD、RXD、GND连接。现在发现,msp430完全放电后后连接到stm32系统,只要stm32 TXD线空闲时为高电平,msp430就可以仅靠stm32串口供电继续工作,现在的解决方法在stm32空闲时将串口转换成普通IO后变为低电平。经过测试,msp430fr2311与电脑usb转串口仅三线连接时也会出现该问题,TI针对此问题在不使用光耦时有什么好的解决方法吗?

正弦信号有效值计算波动较大

$
0
0

芯片:MSP430FR6972

问题描述:

通过运放电路处理罗氏线圈出来的正弦信号,然后通过单片机自带的ADC采集出来,然后将采集到的信号先计算平均值(为了计算参考电压分量),然后采样值减参考分量后计算均方根值。

计算时发现计算的均方根值总是出现波动,导致精度一直难以满足。因此想请教一下,问题出在哪部分?

看波形挺好的呀!是不是参考不准导致的呀,因为测量发现1.25V参考(芯片REF3312),有时是1.24,1.26,1.25。

相关程序;

void Sample_Calculate(void)
{
 uint8_t i = 0;
 int16_t actual_val = 0;  //实际采样电压编码值(有符号)
 uint32_t result_temp = 0; //缓存乘法器计算值 
 uint16_t current_avg = 0; //电流平均值
 uint32_t current_sum = 0; //存放电流和
 
 uint16_t c_act_rms;   //电流裸数值
 
 /* 求平均 */
 for(i=0; i<20; i++)
 {
  current_sum += Indicator_Status.Sample_Current[Indicator_Status.Calculate_Node][i];
 }
 current_avg = current_sum / 20;
 current_sum=0;
 /* 开方 */
 for(i=0; i<20; i++)
 {
  actual_val = Indicator_Status.Sample_Current[Indicator_Status.Calculate_Node][i] - current_avg;
  MPYS = actual_val;
  OP2  = actual_val;
  //_NOP();_NOP();_NOP();
  result_temp = RESHI;
  result_temp <<= 16;
  result_temp |= RESLO;
  current_sum += result_temp;
 }
 
 c_act_rms = sqrt2(current_sum); //未校正电流裸数值
 Indicator_Status.Current_RMS=RMS_Correction(c_act_rms);     //电流校正
}

相关电路图:

相关波形:

MSP430FR2111 IO口输出

$
0
0

  1,用示波器测量有问题的I/O工作波形;发现MCU的I/O工作波形有问题,与正常的I/O工作波形有差异。主要表现为IO口波形的高电平宽度增大,影响了客户后端MOS管开关的工作时序,导致MOS管上下管同时导通

  2,读出有问题的MCU的程序,对比烧录文件;两者文件相比无差异,说明程序一致;

  3,把问题有的MCU换到另一个正常PCBA板上后,用示波器测量,发现工作波形还是有问题。

MCU原理图及相关波形如下所示。

请教引起该问题的原因及解决方案,谢谢!

正常波形如下:

有问题的IO口波形:

关于rtc中断的问题

$
0
0

 我的板子是msp-expcc430rf4, 在研究历程是发现如图这段程序, 这是个实时时钟用作定时器? 我尝试在中断程序中加入led灯反转: P1OUT ^=BIT0; 但是运行后并无反应。 请问这不是定时器吗? 我也有尝试将//RTCCTL0 |= RTCTEVIE;前的//删去 但是没用。

请教一下,MSP432 如何能实现动态更改波特率?

$
0
0

需求是这样的:MCU 上电之后,UART2 默认9600 的波特率与终端设备通信,与此同时,UART0与上位机连接(固定的波特率参数),需要能在上位机上更改UART2串口的波特率参数,且不能重启MCU

我的初始化的 做法是这样的:上电设置默认参数;

void init_com2()
{

    UART_Params uartParams;

    UART_init();     

    /* Create a UART with data processing off. */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;        //写数据模式
    uartParams.readDataMode = UART_DATA_BINARY;         //读数据模式
    uartParams.readReturnMode = UART_RETURN_FULL;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.dataLength = UART_LEN_8;
    uartParams.stopBits = UART_STOP_ONE;
    uartParams.parityType=UART_PAR_EVEN;            /*增加一个偶校验;*/ //  UART_PAR_ODD 奇校验
    uartParams.baudRate = 9600;

    com_app2 = UART_open(Board_UART2, &uartParams);      /*用于将UART_Params结构初始化为其默认值的函数*/

    if (com_app2 == NULL) {
        /* UART_open() failed */
        while (1);
    }
}

此9600 波特率的状态下,能正常与终端设备进行通信,收发数据都没问题;

在收到上位机更改UART2参数的命令之后,我是这么做的:

    void Reset_com2()
{
    UART_Params uartParams;

    UART_readCancel(com_app2);      //停止串口2 的读写操作;
    UART_writeCancel(com_app2);

    if(com_app2)
    {
        UART_close(com_app2);      /*关闭串口2*/
        com_app2 = NULL;           //置空;
    }    

    UART_init();   //重新初始化参数

    /* Create a UART with data processing off. */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;        //写数据模式
    uartParams.readDataMode = UART_DATA_BINARY;         //读数据模式
    uartParams.readReturnMode = UART_RETURN_FULL;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.dataLength = get_data;     //传入数据位
    uartParams.stopBits = get_stop;     //传入停止位
    uartParams.parityType= get_veri;    //传入校验位
    uartParams.baudRate = Baud_Rate;    //传入波特率参数;
    //UART_enableModule(EUSCI_A0_BASE);

    com_app2 = UART_open(Board_UART2, &uartParams);      /*重新打开UART2串口*/

    if (com_app2 == NULL) {
        /* UART_open() failed */
        while (1);
    }

}

 

其中,get_date、get_stop、get_veri和Baud_Rate 参数的类型值是符合库文件声明,单步Debug过程中,也能看到该值已正确传入;

现在的现象是:无论我上位机对波特率作何更改(其他变量与初始保持一致的前提下),串口2 的波特率还是9600。

比如我在上位机上将UART2波特率改为115200,用串口助手也设置成115200,去模拟终端设备发送数据,MCU无法收到,但是将串口助手改为9600,MCU就能正常收到。

也就是说,上面 Reset_com2()  函数执行之后,没有改变掉原来的波特率设定,看了好久 TI 官方的库文件,也没有对这方面的详细说明,调试了两天仍没进展,希望 TI 工作人员能给一点思路

Viewing all 3634 articles
Browse latest View live