工具与软件:
您好!
我会在 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';
}
休息;
}
}