打印

怎么在AD转换中断里写SD卡?

[复制链接]
1823|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huofeijingfe|  楼主 | 2012-9-21 00:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是TA的触发信号,然后想在AD转换的中断里把转换的数据写进SD卡的文件里,但是总是只能写一次的数据,不能接着上次写的数据写。文件系统用的FAT16格式的。贴一段代码,大家看看是哪里出问题了。









#include <msp430x14x.h>
#include "mmc.h"
#include "fAT16.h"
#include <stdio.h>
#include <string.h>

unsigned long cardSize = 0;
unsigned char status = 1;
unsigned int timeout = 0;
int i = 0;
int z=0;
char buffer[512]="";
char str[16];
int k=0;
unsigned int AC[200]={0}; //存放交流结果
uint8 Name[11];
#define Num_of_Results 64
int results[Num_of_Results] = {0};

void ADC_Init(void);

void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Disable the Watchdog.
while (status != 0) // if return in not NULL an error did occur and the

// MMC/SD-card will be initialized again
{
status = initMMC();
timeout++;
if (timeout == 50) // Try 50 times till error
{
printf ("No MMC/SD-card found!! %x\n", status);
break;
}
}
while ((mmc_ping() != MMC_SUCCESS)); // Wait till card is inserted
// Read the Card Size from the CSD Register
cardSize = MMC_ReadCardSize();
ReadBPB();
uint8 Name[11]="TEST0000TXT";
CreateFile(Name);
P4DIR=0x03;
ADC_Init(); // Initialize ADC12
ADC12CTL0 |= ENC; // Start conversion
while(1);
}


void ADC_Init(void)
{
P1DIR = 0xff; // set port to outputs
P1OUT = 0; // reset port outputs
P6SEL |= 0x01; // select A0 input
ADC12CTL0 = ADC12ON+SHT0_1+REF2_5V+REFON; // Setup ADC12
ADC12CTL1 = SHP+CONSEQ_2+SHS_1; // Timer triggers sampling
ADC12MCTL0 = INCH_0 + SREF_1;
ADC12IE = 0x0001; // Enable ADC12IFG.0


TACCR0 = 32; // Delay to allow Ref to settle
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_1 | MC_1; // TACLK = ACLK, Up mode.
_BIS_SR(LPM3_bits + GIE); // Wait for delay, Enable interrupts
TACCTL0 &= ~CCIE; // Disable timer

P2SEL |= BIT3; // Set for Timer A1
P2DIR |= 0x08;
TACCR0 = 32; // Init TACCR0 w/ sample prd=CCR0+1
TACCR1 = 16; // Trig for ADC12 sample & convert
TACCTL1 = OUTMOD_3; // Set/reset
TACTL = TACLR | MC_1 | TASSEL_1; // ACLK, clear TAR, up mode
}

// Timer_A0 Interrupt Service Routine
#pragma vector=TIMERA0_VECTOR
__interrupt void ta0_isr(void)
{

TACTL = 0;
LPM0_EXIT; // Exit LPM0 on return
}


// ADC12 Interrupt Service Routine
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
if(z%2==0)
{
P4OUT=0x01;
results[z++]=ADC12MEM0;
}
else
{
P4OUT=0x02;
results[z++]=ADC12MEM0;

if (z == 64)
{
z = 0;
for(int j=0;j<64;j++)
{
sprintf(str,"%04x ",results[j]);
strcat(buffer,str);
}

OperateFile(1,"TEST0000TXT",k*512,512,buffer);
k++;

}
}
}

相关帖子

沙发
mucanhin| | 2012-9-21 00:22 | 只看该作者
关键应该在这个函数OperateFile(1,"TEST0000TXT",k*512,512,buffer);
里面确保:
你判断是否存在文件,不存在用创建方式打开(一般不会,因为你上面已经创建了);
如果存在,用读写方式打开,并移动指针到文件末尾,再写入


另外,建议把数据保存部分放到中断外面。

使用特权

评论回复
板凳
gibenlin| | 2012-9-21 00:48 | 只看该作者
首先我不太清楚你是怎么读写SD卡的,所以不好说。
其次你可以这样:
设置一个全局标志,当AD采样满512字节时置1。
主函数里检测到标志为1就写入,清标志,等待。
如果中断影响写入的话先禁止中断,不一定

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

128

帖子

0

粉丝