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.

[参考译文] MSP430F67641:SD24B 存储器寄存器读取。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/918483/msp430f67641-sd24b-memory-register-reading

器件型号:MSP430F67641

您好!

我在自己设计的电路板上使用 MSP430F67641编写论文代码。

我需要设置 Σ-Δ 模块来测量市电交流电压、但我总是从转换存储器寄存器中读取0值。

有时、我能够从 SD24存储器寄存器中捕获一些随机数据、因此我非常确定存在一些软件错误、

除了 SD24模块之外、一切都正常。

SD 由偏离16的 SMCLK (16MHz)计时,以通过所选 uC 的最大要求。

代码如下:

#include 
#include 
#include 

void CLOCKinit (void);
void GPIOinit (void);
void USCIinit (void);
void TIMERinit (void);
void LEDseq (void);
void SD24Binit (void);
void USCI_SEND_string (char*);
void USCI_SEND_CHAR (char);


unsigned long SD24B_RESULT = 0;//Sigma - delta
unsigned long SD24B_RESULT_2 = 0;//Sigma - delta
long 计数器= 0;
int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
CLOCKinit();
GPIOinit();
TIMERinit();
USCIinit();
SD24BIINIT();

_Bis_SR_register (GIE);//全局中断使能

字符缓冲区[32];

for (;;)
{
SD24BCCTL0 |= SD24SC;
sprintf (buffer、"SD24B_buff:%ld\t:\t%ld n\r\n "、SD24B_result、counter);
USCI_SEND_string (&buffer[0]);
for (long i=0;i<200000;i++){};
LEDseq();

}
返回0;
}

void CLOCKinit (void)
{
UCSCTL1 = DCORSEL_4;
UCSCTL3 = SELREF__REFOCLK;//FLL 基准时钟-> REFO (32、768 KHz)
UCSCTL2 = 0x0000;
UCSCTL2 |= 487 | FLLD__1;//FLLN = 487 / FLLD = 2;
UCSCTL4 = OUT_DCOCLK | SELM_DCOCLK;
}

void LEDseq (void)
{
static unsigned short shift = 0;
if (shift < 2) shift +;
else
{OUT= 0
;
}P4OUT

= 0;P4OUT = 1 (void)(void)(void)(void)(void)(void)(void)(void)(void ~ RXD 输入
// P2.3 -> TXD 输出
P2SEL = BIT2 | BIT3;

UCA2CTL1 &=~UCSWRST;
}

void SD24BIIT (void)
{
//时钟源= SMCLK
//时钟源分频/ 16
//内部参考
SD24BCTL0 = SD24PDIV_4;SD24BCL0
= SD24BSDBCLK
;SD24BSDBCL0 = SD24SDBCLK= SD24BSDBSDBCL0;SD24BSDBCLK= SD24SDBSDBCLK= SD24BSDBSD24CLK= SDBSDBSD24CL0;SDBSD24CLK= SD24BSD24


_DELAY_CYCLES (0x3600);
}
void USCI_SEND_string (char * buffer)
{
while (* buffer)
{
USCI_SEND_CHAR (* buffer++);
}


void USCI_SEND_CHAR (








~


void char_TO_SEND){UCA2TXBUF = char_TO_SEND;while (UCA2STAT_TRISR_TO_SEND)}(void)
(void USCI_TRISR_TRIB_TRIB_0_TO_TRUCCTRU0_TRIB_TRU_TRU0)(void)(void (_ TO_TRIF_TRIB_TRIB_TRIB_TRIB_0_TRU_TRU_TRIBU_TRU_TRU
开关(SD24BIV)
{
案例 SD24BIV_SD24OVIFG: // SD24MEM 溢出
中断;
案例 SD24BIV_SD24TRGIFG: // SD24触发 IFG
中断;
案例 SD24BIV_SD24IFG0: // SD24MEM0 IFG
SD24B_RESULT =(SD24BMEMH0);
SD24B_RESULT =(SD24B_RESULT<<16)| SD24BMEML0;
COUNTER++;
中断;
SD24BIV_SD24IFG1案例: // SD24MEM1 IFG
中断;
SD24BIV_SD24IFG2案例: // SD24MEM2 IFG
中断;
}
} 

电路板原理图(基于 TIDM-THDREADING 参考设计):

e2e.ti.com/.../board_5F00_schematic.pdf

请帮帮我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    上半部分:
    >        SD24BCCTL0 |= SD24SC;
    >        sprintf(buffer, "SD24B_buff: %ld\t:\t%ld\n\r", SD24B_result, counter);

    This doesn't wait for the SD24 to complete the conversion, so you're getting the initialization value. Typically this interlock is done by inserting "LPM0;" between these two lines and inserting "LPM0_EXIT;" after fetching the value in the ISR.

    -----------------

     Second half:

    > void__attribute__((interrupt(TIMER0_A0_VECTOR))) TimerA_ISR(void)

    这不是 TAIFG 的适当向量。 因此、大约1ms 后、您的 CPU 将复位(并隐式清除 SD24B_RESULT)。 尝试:

    > void__attribute__((interrupt(TIMER0_A1_VECTOR))) TimerA_ISR(void)

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

    如您所见、我在 SD24B ISR 中更新了 SD24B_RESULT 变量并递增了"counter"变量。

    我在终端中观察数据、"counter"变量会正确递增、因此我不必等待或进入低功耗模式来捕获一些数据。 我是对的吗?

    我还确保定时器中断矢量命名的一切正常、因为我之前使用过它。 如果这是错误的、并且我的 CPU 将在 GIE 之后1ms 复位、它也应该清除"计数器"值。

    但下面是我在终端中得到的结果:

    我已经尝试根据您的建议来转动 LMP0并从代码中删除完整的计时器。 SD24B_RESULT = 0。

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

    您好!

    您是否尝试调试代码并确认 MEM 寄存器中的值? 输入是什么? 对于默认的二进制偏移模式、对于接近零的输入、您应该得到一个非零结果。 在不连接到高压的情况下、使用工作台电源在+/-引脚之间施加已知输入电压可能是不错的。

    此致、

    James