Other Parts Discussed in Thread:MSP430I2041
void vPortsd24Stop()
{
SD24INCTL2 &= ~SD24SC; // Set bit to start conversion
sd24OK = TRUE;
}
BOOL xPortsd24Init( UCHAR delay,UCHAR num)
{
BOOL bInitialized = TRUE;
sd24num = num;
// Configure GPIO
SD24CTL = SD24REFS; // Internal ref
SD24CCTL0 |= SD24GRP | SD24DF | SD24IFG | SD24SNGL; // Enable interrupt
SD24INCTL0 |= SD24INCH_6;
SD24CCTL1 |= SD24GRP | SD24DF | SD24IFG;
SD24CCTL2 |= SD24IE | SD24DF | SD24IFG;
SD24INCTL1 |= SD24GAIN_16;
SD24INCTL2 |= SD24GAIN_16;
SD24PRE1 = delay;
SD24PRE2 = delay;
delay_us(10);
return bInitialized;
}
Susan Yang:
“系统默认的16.348M时钟不对” 具体是指什么呢?能否详细说明下您的问题?
,
user5322468:
当程序运行了,我上面贴出来的代码后,系统的默认时间,就错误了。之后程序就运行不起来,
,
Susan Yang:
错误的具体表现是什么?我现在没有这个型号的板子,所以无法测试。
SD24是有官方例程的,您可以参考下MSP430Ware_3_80_07_00\examples\devices\MSP430i2xx\MSP430i20xx_Code_Examples\C的相关SD例程
,
user5322468:
运行了上面的代码后,在仿真,就会一直进入到LOW_LEVEL_INIT.c中的
REFCAL1=*(TLV_address_for_parse+TLV_CAL_REFCAL1);程序无法正常运行
,
Susan Yang:
REFCAL1=*(TLV_address_for_parse+TLV_CAL_REFCAL1);
REF校验的前面已经是什么?是否是TLV校验没有通过,然后芯片直接进入了LPM4?
请您给出详细信息或者调试截图
,
user5322468:
在使用过程中,一块完整的片子,扫入代码,启动SD24后,一直进入low_level_init文件中system_pre_init中,
完整片子时钟测试输出是1.648M,运行程序后,通过IO输出时钟22.5M.使用的是smlck。
如下是sd24初始化和使用的low_level_init文件
BOOL xPortsd24Init( UCHAR delay,UCHAR num){ BOOL bInitialized = TRUE; sd24num = num; // Configure GPIO SD24CTL = SD24REFS; // Internal ref
SD24CCTL0 |= SD24GRP | SD24DF | SD24IFG | SD24SNGL; // Enable interrupt SD24INCTL0 |= SD24INCH_6; SD24CCTL1 |= SD24GRP | SD24DF | SD24IFG; SD24CCTL2 |= SD24IE | SD24DF | SD24IFG; SD24INCTL1 |= SD24GAIN_16; SD24INCTL2 |= SD24GAIN_16; SD24PRE1 = delay; SD24PRE2 = delay;
/*SD24_init(SD24_BASE, SD24_REF_INTERNAL); // Select internal REF SD24_initConverterAdvancedParam param = {0}; param. converter = SD24_CONVERTER_2; // Select converter param. conversionMode = SD24_SINGLE_MODE; // Select single mode param. groupEnable = SD24_NOT_GROUPED; // No grouped param. inputChannel = SD24_INPUT_CH_ANALOG; // Input from analog signal param. dataFormat = SD24_DATA_FORMAT_2COMPLEMENT; // 2鈥檚 complement data format param. interruptDelay = SD24_FOURTH_SAMPLE_INTERRUPT; // 4th sample causes interrupt param. oversampleRatio = SD24_OVERSAMPLE_256; // Oversampling ratio 256 param. gain = SD24_GAIN_1; // Preamplifier gain x1 SD24_initConverterAdvanced(SD24_BASE, 露m); delay cycles(0x3600); // Delay for 1.5V REF startup*/
delay_us(10); return bInitialized;}
#ifdef __TI_COMPILER_VERSION__int _system_pre_init(void)#elif __IAR_SYSTEMS_ICC__int __low_level_init(void)#elif __GNUC__extern int system_pre_init(void) __attribute__((constructor));int system_pre_init(void)#else#error Compiler not supported!#endif{ unsigned long *jtagPwd = (unsigned long *)JTAG_DIS_PWD1;
/* Feed the watchdog timer */ WDTCTL = WDTPW | WDTCNTCL;
/* Check JTAG password locations and disable JTAG if passwords don't match. * Else the JTAG will be enabled in the 64th cycle after reset. */ if ((*jtagPwd != 0x00000000) && (*jtagPwd != 0xFFFFFFFF)) { /* Disable JTAG */ SYSJTAGDIS = JTAGDISKEY; }
/* Calibration section * Check for the BORIFG flag in IFG1. Execute calibration if this was a BORIFG. * Else skip calibration */ if (IFG1 & BORIFG) { /* Perform 2's complement checksum on 62 bytes of TLV data */ unsigned int checksum = 0; unsigned char *TLV_address_for_parse = ((unsigned char *)TLV_START); unsigned int *TLV_address_for_checksum = ((unsigned int *)TLV_START + 1);
do { checksum ^= *TLV_address_for_checksum++; } while (TLV_address_for_checksum <= (unsigned int *)TLV_END);
checksum ^= 0xFFFF; checksum++;
/* If check sum is not correct go to LPM4 */ if (*((unsigned int *)TLV_START) != checksum) { /* Enter LPM4 if checksum failed */ __bis_SR_register(LPM4_bits); }
/* Check sum matched, now set calibration values */
/* Calibrate REF */ REFCAL1 = *(TLV_address_for_parse + TLV_CAL_REFCAL1); REFCAL0 = *(TLV_address_for_parse + TLV_CAL_REFCAL0);
/* Calibrate DCO */ CSIRFCAL = *(TLV_address_for_parse + TLV_CAL_CSIRFCAL); CSIRTCAL = *(TLV_address_for_parse + TLV_CAL_CSIRTCAL); CSERFCAL = *(TLV_address_for_parse + TLV_CAL_CSERFCAL); CSERTCAL = *(TLV_address_for_parse + TLV_CAL_CSERTCAL);
/* Calibrate SD24 */ SD24TRIM = *(TLV_address_for_parse + TLV_CAL_SD24TRIM);
/* Clear BORIFG */ IFG1 &= ~(BORIFG); }
/* Feed the watchdog timer */ WDTCTL = WDTPW | WDTCNTCL;
/* Return value: * 1 – Perform data segment initialization. * 0 – Skip data segment initialization. */ return 1;}
,
灰小子:
你是不是有使用到大数组比较占用存储空间,或者需要较长时间进行初始化的内容?
,
user5322468:
我看map文件里面都还有剩余的空间,初始化的时候,只是做了个结构体的赋值,和flash读取,然后就是初始化SD24。
,
user4380693:
作为一个用msp430i2041开发过6个项目的人告诉你,这个芯片用不了通讯类的和计时类的项目,内部时钟周期太不准了16.348是个呵呵的数据,每个单片机的真实 周期按照实测为准,想用串口通讯的,会有些麻烦