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.

[参考译文] MSP430F6736:在 SD24B 转换后发送 SPI

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1477657/msp430f6736-send-spi-after-sd24b-conversion

器件型号:MSP430F6736

工具与软件:

您好!

我会在 SD24B 转换完成时尝试通过 SPI 发送数据。
该器件作为从器件运行、负责传输数据。
是否知道代码无法正常运行的原因?
是否可能是中断问题?

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "msp430.h"
#include
#include
#include

第260章我的女人

/*用于存储 SD24_B 转换结果的数组*/
unsigned long Ch0Results[Num_of_Results];
unsigned long Ch1Results[Num_of_Results];
unsigned long Ch2Results[Num_of_Results];


void 16MHz ()

UCSCTL3 |= SELREF_2;//设置 DCO FLL 基准= REFO
UCSCTL4 |= SELAY_0;//设置 ACLK = XT1CLK
__bis_SR_register (SCG0);//禁用 FLL 控制环路
UCSCTL0 = 0x0000;//设置尽可能低的 DCOx、MODx
UCSCTL1 = DCORSEL_5;//选择 DCO 范围16MHz 的操作
UCSCTL2 = FLLD_0 + 487;//设置16MHz 的 DCO 乘法器
//(N + 1)* FLLRef = Fdco
//(487 + 1)* 32768 = 16MHz
//设置 FLL Div = fDCOCLK
_BIC_SR_register (SCG0);//启用 FLL 控制环路

//当 DCO 范围位已设置时 DCO 最坏情况下的稳定时间
//更改了 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 章节
//优化。
// 32 x 32 x 16 MHz / 32,768Hz = 500000 = DCO 稳定的 MCLK 周期
__delay_cycles (500000);//

UCSCTL6并且=~(XT1OFF);// XT1打开
UCSCTL6 |= XCAP_3;//内部负载电容
//循环直到 XT1故障标志被清除
应执行的操作

UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1并且=~OFIFG;//清除故障标志
—while (SFRIFG1&OFIFG);//测试振荡器故障标志

UCSCTL6并且=~(XT1DRIVE_3);// XTAL 现在稳定、减少驱动强度
}

uint16_t setVCoreUp (uint8_t 电平){
uint32_t PMMRIE_backup、SVSMHCTL_backup、SVSMLCTL_backup;

//增加 Vcore 的代码流程已被修改为可以解决
//错误的 FLASH37。
//请参阅勘误表以了解特定的器件是否会受到影响
//请勿更改此函数

//打开 PMM 寄存器以进行写入访问
PMMCTL0_H = 0xA5;

//禁用专用中断
//备份所有寄存器
PMMRIE_BACKUP = PMMRIE;
PMMRIE &=~(SVMHVLRPE | SVSHPE | SVMLVLRPE |
SVSLPE | SVMHVLRIE | SVMHIE |
SVSMHDLYIE | SVMLVLRIE | SVMLIE |
SVSMLDLYIE
);
SVSMHCTL_BACKUP = SVSMHCTL;
SVSMLCTL_BACKUP = SVSMLCTL;

//清除标志
PMMIFG = 0;

//将 SVM 高侧设置为新的电平、并检查 VCORE 是否可能增加
SVSMHCTL = SVMHE | SVSHE |(SVSMHRRL0 *电平);

//等待 SVM 高侧稳定
while ((PMMIFG 和 SVSMHDLYIFG)=0)


}

//清除标志
PMMIFG &=~SVSMHDLYIFG;

//检查 VCORE 是否可以增加
if ((PMMIFG & SVMHIFG)== SVMHIFG)

//->Vcc 太低、不能使 Vcore 增加
//恢复以前的设置
PMMIFG &=~SVSMHDLYIFG;
SVSMHCTL = SVSMHCTL_BACKUP;

//等待 SVM 高侧稳定
while ((PMMIFG 和 SVSMHDLYIFG)=0)


}

//清除所有标志
PMMIFG &=μ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
SVMLVLRIFG | SVMLIFG |
SVSMLDLYIFG
);

//恢复 PMM 中断使能寄存器
PMMRIE = PMMRIE_BACKUP;
//锁定 PMM 寄存器以进行写入访问
PMMCTL0_H = 0x00;
//返回:未设置电压
返回 false;
}

//也将 SVS 高电平设置为新的电平
//Vcc 高到足以使 Vcore 增加
SVSMHCTL |=(SVSHRVL0 *电平);

//等待 SVM 高侧稳定
while ((PMMIFG 和 SVSMHDLYIFG)=0)


}

//清除标志
PMMIFG &=~SVSMHDLYIFG;

//将 VCORE 设置为新的水平
PMMCTL0_L = PMMCOREV0 *电平;

//将 SVM、SVS 的低电平设定为新的电平
SVSMLCTL = SVMLE |(SVSMLRRL0 *电平)|
SVSLE |(SVSLRVL0 *等级);

//等待 SVM、SVS 低电平的稳定
while ((PMMIFG 和 SVSMLDLYIFG)=0)


}

//清除标志
PMMIFG &=~SVSMLDLYIFG;
// SVS、SVM 内核和高侧现在设置为针对新的内核级别进行保护

//恢复低侧设置
//清除所有其他位_except_ level 设置
SVSMLCTL &=(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 +
SVSMLRRL1 + SVSMLRRL2
);

//清除备份寄存器中的电平设置、保持所有其他位
SVSMLCTL_BACKUP &=
~(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);

//恢复低侧 SVS 监视器设置
SVSMLCTL |= SVSMLCTL_BACKUP;

//恢复高侧设置
//清除除电平设置之外的所有其他位
SVSMHCTL &=(SVSHRVL0 + SVSHRVL1 +
SVSMHRRL0 + SVSMHRRL1 +
SVSMHRRL2
);

//清除备份寄存器中的电平设置、保持所有其他位
SVSMHCTL_BACKUP &=
~(SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);

//恢复备份
SVSMHCTL |= SVSMHCTL_BACKUP;

//等待直到高侧、低侧稳定
while (((PMMIFG 和 SVSMLDLYIFG)=0)&&
((PMMIFG 和 SVSMHDLYIFG)=0))


}

//清除所有标志
PMMIFG &=μ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG
);

//恢复 PMM 中断使能寄存器
PMMRIE = PMMRIE_BACKUP;

//锁定 PMM 寄存器以进行写入访问
PMMCTL0_H = 0x00;

返回 true;
}

bool increaseVCoreToLevel2()

uint8_t 电平= 2;
uint8_t actlevel;
Bool status = true;

//将掩码设置为最大值。 问题
电平&= PMMCOREV_3;

//获取实际的 VCORE
actlevel = PMMCTL0 & PMMCOREV_3;

//逐步增加或减少
while ((level!= actlevel)&&(status == true))

if (level > actlevel)

STATUS = setVCoreUp (++actlevel);
}
}

返回(状态);
}

void SPI_init (void)

//设置 P1.2 UCA0SOMI、P1.3 UCA0SIMO、P1.6 UCA0CLK
P1SEL |=位7;
P2SEL |= BIT0 | BIT1;

UCB0CTLW0 |= UCSWRST;//**将状态机置于 RESET**中
UCB0CTLW0 |= UCSYNC | UCMSB ;
// 3引脚、8位 SPI 从器件、
//时钟极性高、MSB

UCB0CTLW0 &=~UCSWRST;//**初始化 USCI 状态机**
UCB0IE |= UCRXIE | UCTXIE;//启用 RX 中断//启用 RX 中断

}

void SD24_init (void)

SD24BCTL0 = SD24REFS | SD24SSEL_1 | SD24DIV4;//选择内部 REF
//选择 SMCLK 作为 SD24_B 时钟源

SD24BCCTL0 = SD24ALGN | SD24SCS_4;//左对齐、组0
SD24BCCTL1 = SD24ALGN | SD24SCS_4;//左对齐、组0
SD24BCCTL2 = SD24ALGN | SD24SCS_4;//左对齐、组0

SD24BINCTL0 = SD24GAIN_1;
SD24BINCTL1 = SD24GAIN_1;
SD24BINCTL2 = SD24GAIN_1;

SD24BIE = SD24IE2;//启用通道2中断

__delay_cycles (0x3600);//延迟1.5V REF 启动

//SD24BCTL1 |= SD24GRP0SC;//设置位来启动转换

}

int main (void)

WDTCTL = WDTPW | WDTHOLD;//停止 WDT


increaseVCoreToLevel2();
initClock4.12.4C() 16MHz;
spi_init();
SD24_init();

_NOP();
_EINT();

while (1)

}
}

#pragma VECTOR=SD24B_VECTOR
__interrupt void SD24BIISR (void)

静态无符号 int ADC_INDEX = 0;

开关(SD24BIV)

案例 SD24BIV_SD24OVIFG:// SD24MEM Overflow
休息;
案例 SD24BIV_SD24TRGIFG:// SD24 Trigger IFG
休息;
案例 SD24BIV_SD24IFG0:// SD24MEM0 IFG
休息;
案例 SD24BIV_SD24IFG1:// SD24MEM1 IFG
休息;
案例 SD24BIV_SD24IFG2:// SD24MEM2 IFG

Ch0Results[ADC_index]= SD24BMEMH0;//保存 CH0结果(清除 IFG)
Ch1Results[ADC_index]= SD24BMEMH1;//保存 CH1结果(清除 IFG)
Ch2Results[ADC_index]= SD24BMEMH2;//保存 CH2结果(清除 IFG)
ADC_INDEP++;

如果(ADC_INDEX >= Num_of_Results)

ADC_INDEX = 0;

while (!(UCB0IFG & UCTXIFG));// USCI_A0 TX 缓冲区已就绪?
UCB0TXBUF='Y';
}

休息;
}
}

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

    > UCB0IE |= UCRXIE | UCTXIE;//启用 RX 中断//启用 RX 中断

    您将启用这些 UCB0中断、但看不到用于它们的 ISR。 第一个中断会将程序关闭到 default_handler (我忘记了它调用的内容)。

    我建议您删除这一行、除非/直到您需要它们。

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

    很抱歉这么晚才回复。
    我应用了您的建议、现在它运行得很好。 谢谢!