Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LCD 3310 + mmc на atmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
bur_13
Здравствуйте уважаемые форумчане.
недавно решил попробовать реализовать маленькую читалку mmc карточек с выводом на дисплей от нокии 3310. карточка и дисплей подключены на одну шину SPI и для них определены разные SS. и тут возникла проблема, при первом проходе программы карточка инициализируется и получаю правельный ответ "0", потом инициализируется дисплей и выводится текст "карта активна". все бы хорошо, но, при втором проходе карточка никак не хочет инициализироваться((.
драйвер на 3310 скачал с нета, а функции mmc есть в самом cvavr.
кто сталкивался, или может помочь с настройкой SPI и совместимостью карты и дисплея, помогите пожалуйста разобраться.
заранее благодарствую.
проект во вложении.Нажмите для просмотра прикрепленного файла
Xenia
Цитата(bur_13 @ Dec 7 2014, 16:30) *
недавно решил попробовать реализовать маленькую читалку mmc карточек с выводом на дисплей от нокии 3310.
проект во вложении.Нажмите для просмотра прикрепленного файла


Никак не могу разглядеть, где в вашем коде работа в mmc-картой. Вижу только код, относящийся к дисплею.
bur_13
для работы с mmc картой подключен, стандартный в cvavr, "sdcard.h" драйвер. а больше пока что никаких операций с карточкой и не выполняется кроме "disk_initialize(0);".
Код
while (1)
      {
disk_initialize(0);
delay_ms(100);
if(disk_initialize(0)==0)
    {
     LCDInit();
     LCDStr(0, 0, "Карта активна");
     delay_ms(1000);
     LCDClear();
    }
    else
LCDStr(0, 0, "Нет карты");  
      }
после обработки функции "LCDInit();" SPI больше ни на что не хочет реагировать, сколько бы я не пытался вызвать функцию "disk_initialize(0);" карта не определяется(
www...
По SD картам
Обязательно проверь что подключены все инклюды, еще вроде для работы с файловой системой есть ограничение по оперативке проца (на второй версии CVA с картами памяти можно было работать только на atmega128)
Еще нужно проверить правильно ли настроен SPI
Вот код рабочего проекта, который читает из файла на флешке, немного перекодирует и выплевывает в uart
CODE
#include <mega128.h>
#include <delay.h>
#include <ff.h>
#include <stdio.h>
#include <delay.h>
#include <string.h>
#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 8

/* Timer1 overflow interrupt frequency [Hz] */
#define T1_OVF_FREQ 100
/* Timer1 clock prescaler value */
#define T1_PRESC 1024L
/* Timer1 initialization value after overflow */
#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))
#define MAX_LEN 64

#define ADC_VREF_TYPE 0xE0
/* FAT function result */
FRESULT res;
char ercount;
char wcd;
char ok;
char ok1;
char del_flash;
char rx_buf[128];//приемный буфер UART
char rx_count; //счЄтчик прин¤тых байт
char line_redy;//флаг приЄма строки

/* number of bytes written/read to the file */
unsigned int nbytes;
/* will hold the information for logical drive 0: */
FATFS fat;
/* will hold the file information */
FIL file;
/* will hold file attributes, time stamp information */
FILINFO finfo;
/* file path */
char path[12]="0:/hex.hex";
/* text to be written to the file */
/* file read buffer */
void sys_init(void);
void prog(void);
void earse(void);
void error(void);
void chip_detect(void);

char rx_buffer0[RX_BUFFER_SIZE0];

#if RX_BUFFER_SIZE0 <= 256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif

// This flag is set on USART0 Receiver buffer overflow
bit rx_buffer_overflow0;

// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer0[rx_wr_index0++]=data;
#if RX_BUFFER_SIZE0 == 256
// special case for receiver buffer size=256
if (++rx_counter0 == 0)
{
#else
if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
if (++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0=0;
#endif
rx_buffer_overflow0=1;
}
}
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0++];
#if RX_BUFFER_SIZE0 != 256
if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#endif
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif



/* 100Hz timer interrupt generated by ATmega128 Timer1 overflow */
interrupt [TIM1_OVF] void timer_comp_isr(void)
{

if (wcd==1)
{
ercount=ercount+1;
if (ercount>200) error();
}
if (ok==1)
{
ercount=ercount+1;
if (ercount>200) PORTA=0;
}

/* re-initialize Timer1 */
TCNT1H=T1_INIT>>8;
TCNT1L=T1_INIT&0xFF;
/* card access low level timing function */
disk_timerproc();
}


/* error message list */
flash char * flash error_msg[]=
{
"", /* not used */
"FR_DISK_ERR",
"FR_INT_ERR",
"FR_INT_ERR",
"FR_NOT_READY",
"FR_NO_FILE",
"FR_NO_PATH",
"FR_INVALID_NAME",
"FR_DENIED",
"FR_EXIST",
"FR_INVALID_OBJECT",
"FR_WRITE_PROTECTED",
"FR_INVALID_DRIVE",
"FR_NOT_ENABLED",
"FR_NO_FILESYSTEM",
"FR_MKFS_ABORTED",
"FR_TIMEOUT"
};


// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}


void main(void)
{
char adc0;
wcd=0;
ok=0;
delay_ms(200);
sys_init();
PORTA=0x10;
delay_ms(200);
adc0=read_adc(0);
if (adc0<155){PORTA=0x14;delay_ms(100);PORTA=0x00;}
if ((adc0>155)&&(adc0<175)){PORTA=0x14;delay_ms(200);PORTA=0x10;delay_ms(200);};
if ((adc0>=175)&&(adc0<=190)){PORTA=0x14;delay_ms(200);PORTA=0x10;delay_ms(200);PORTA=0x14;delay_ms(
200);PORTA=0x10;delay_ms(200);};
if ((adc0>190)&&(adc0<200)){PORTA=0x14;delay_ms(200);PORTA=0x10;delay_ms(200);PORTA=0x14;delay_ms(2
00);PORTA=0x10;
delay_ms(200);PORTA=0x14;delay_ms(200);PORTA=0x10;delay_ms(200);};
if (adc0>=200){PORTA=0x14;delay_ms(200);PORTA=0x10;delay_ms(200);PORTA=0x14;delay_ms(2
00);PORTA=0x10;delay_ms(200);
PORTA=0x14;delay_ms(200);PORTA=0x10;delay_ms(200);PORTA=0x14;delay_ms(200);PORTA
=0x10;delay_ms(200);};
chip_detect();
earse();
prog();
while (1){}
}

void sys_init(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=In Func0=In
// State7=T State6=T State5=T State4=0 State3=0 State2=0 State1=T State0=T
PORTA=0x00;
DDRA=0x1C;


// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer3 Stopped
// Mode: Normal top=0xFFFF
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

ETIMSK=0x00;

// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x47;

// USART1 initialization
// USART1 disabled
UCSR1B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 691,200 kHz
// ADC Voltage Reference: Int., cap. on AREF
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

/* initialize Timer1 overflow interrupts in Mode 0 (Normal) */
TCCR1A=0x00;
/* clkio/1024 */
TCCR1B=(1<<CS12)|(1<<CS10);
/* timer overflow interrupts will occur with 100Hz frequency */
TCNT1H=T1_INIT>>8;
TCNT1L=T1_INIT&0xFF;
/* enable Timer1 overflow interrupt */
TIMSK=1<<TOIE1;

/* globally enable interrupts */
#asm("sei")

/* mount logical drive 0: */
if ((res=f_mount(0,&fat))!=FR_OK) error();
}
void prog(void)
{
char buffer[64];
char line_hex[64];
char buf[64];
char i;
char str_count;
char x;
char y;
char check;
str_count=0;
i=0;
x=0;
nbytes=0;
ercount=0;
wcd=1;
while(f_open(&file,path,FA_READ)!=FR_OK) {};
wcd=0;
do
{
i=0;
str_count=0;
x=0;
while (i!=64) //почистим буферы
{
line_hex[i]=0;
buffer[i]=0;
buf[i]=0;
i++;
}
ercount=0;
wcd=1;
do
{
while (f_read(&file,buf,1,&nbytes)!=FR_OK){ } //читаем из файла посимвольно
if ((buf[0]!=0x0D)&&(buf[0]!=0x0A)&&(buf[0]!=0x3A)){line_hex[str_count]=buf[0];str_count++;}//не учитываем : и знаки конца строки
}
while (buf[0]!=0x0D); //пока не нашли конец строки
wcd=0;
PORTA=0x10;
if ((strcmp(line_hex,"00000001FF"))!=0) //если не последн¤¤ строка то будем конвертировать в другой формат
{
x=0;
while (x!=str_count)
{
if ((line_hex[x]>=0x30)&&(line_hex[x]<=0x39))buffer[x]=line_hex[x]-0x30;
if ((line_hex[x]>=0x41)&&(line_hex[x]<=0x46))buffer[x]=line_hex[x]-0x37;
x++;
}
i=0;
x=0;
while (i!=str_count) //окончательно формируем hex строку
{
buf[x]=buffer[i]<<4;
i++;
buf[x]=buffer[i]|buf[x];
i++;
x++;
}
buffer[0]=0x07;
buffer[1]=0x0E;
buffer[2]=((buf[0])+4);
buffer[3]=0x57;
buffer[4]=0x00;
buffer[5]=buf[1];
buffer[6]=buf[2];
x=4;
i=7;
y=0;
check=0;
while (y<buf[0])
{
buffer[i]=buf[x];
check=check+buffer[i];
i++;
y++;
x++;
}
str_count=i;
buffer[str_count]=0x100-(check+buffer[2]+buffer[3]+buffer[5]+buffer[6]);
str_count++;
i=0;
while (i<str_count)//str_count)
{
putchar(buffer[i]);
i++;
}
PORTA=0x14;
ercount=0;
wcd=1;
while (getchar()!=0x06){ };
wcd=0;
}
}
while ((strcmp(line_hex,"00000001FF"))!=0); //будем выполн¤ть действи¤ пока не найдем последнюю строку hex
PORTA=0x18;
ok1=0;
while (ok1<200)
{
ok1++;
delay_ms(1000);
putchar(0x21);
putchar(0x5A);
putchar(0x00);
putchar(0xA6);
putchar(0x00);
putchar(0x00);
putchar(0x00);
ercount=0;
ok=1;
while (getchar()!=0x38){}
ok=0;
}
PORTA=0;
}

void earse(void)
{
if (del_flash==0)
{
delay_ms(200);
putchar(0x07);
putchar(0x0E);
putchar(0x01);
putchar(0x41);
putchar(0xBE);
ercount=0;
wcd=1;
while (getchar()!=0x06) { };
wcd=0;
delay_ms(200);
}
if (del_flash==1)
{
delay_ms(200);
putchar(0x07);
putchar(0x0E);
putchar(0x01);
putchar(0x43);
putchar(0xBC);
ercount=0;
wcd=1;
while (getchar()!=0x06) { };
wcd=0;
delay_ms(200);
}

}
/* display error message and stop */
void error(void)
{
PORTA=0x14;
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
PORTA=0;
while(1);
}

void chip_detect(void)
{
char s[32];
char ss;
char i;
i=0;
ss=0;
del_flash=0;
delay_ms(200);
putchar(0x21);
putchar(0x5A);
putchar(0x00);
putchar(0xA6);
putchar(0x00);
putchar(0x00);
putchar(0x00);
ercount=0;
wcd=1;
while (ss!=0x0A)
{
s[i]=getchar();
ss=s[i];
i++;
}
PORTA=0x18;
if (s[0]==0x41)
{
path[3]=0x38;
path[4]=s[5];
path[5]=s[6];
if (f_open(&file,path,FA_READ)!=FR_OK)
{
path[6]=0x66;
path[7]=0x2E;
path[8]=0x68;
path[9]=0x65;
path[10]=0x78;
del_flash=1;
while (f_open(&file,path,FA_READ)!=FR_OK){}
}
res=f_close(&file);
}

wcd=0;
delay_ms(200);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.