Часть вторая C с празником :-)))
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено #1064;#1090;#1091;#1096;#1072;-#1050;#1091;#1090;#1091;#1096;#1072; 01 апреля 2004 г. 12:23
В ответ на: Поэма в двух частях ч первая H отправлено #1064;#1090;#1091;#1096;#1072;-#1050;#1091;#1090;#1091;#1096;#1072; 01 апреля 2004 г. 12:20

#include "SpiMemIO.h"
#include "globvar.h"
#include "iostring.h"

__no_init unsigned int buffer_addr;
__no_init unsigned int page_addr;
void csh(void)
{
char i=10;
PORTE_Bit1=1;
while(--i);
}

void csl(void)
{
char i=10;
PORTE_Bit1=0;
while(--i);
}

char inc_addr(void)
/*
Инкремент текущего адреса
Возвр. значения 1 - переход на след страницу.
0 - нет перехода на след страницу.
*/
{
if(++buffer_addr >= max_bytes){
buffer_addr = 0;
return(1);
}
return(0);
}


unsigned char spi(unsigned char data)
// Передача байта по spi
{
SPDR = data;
while(!SPSR_Bit7);
return(SPDR);
}

void wait_mem_ready(void)
// Ожидание готовности памяти
{
unsigned char data=0;

while (!(data & 0x80)){
asm("wdr");
Led1 = 0;
Led2 = 1;
csl();
spi(0x57);
data=spi(0x00);
csh();
}
}


void buffer_to_mem(void)
/*
Запись буфера в память 0-буффер 2
1-буффер 1
*/
{
wait_mem_ready();
csl();
count_buffer ? spi(0x83): spi(0x86);
spi((unsigned char)(page_addr>>7));
spi((unsigned char)(page_addr<<1));
spi(0x00);
csh();
}

void mem_to_buffer(void)
/*
чтение страницы из памяти в буффер
Адрес страницы -> page_addr
Номер буфера -> count_buffer( 1->1; 0->2)
*/
{
wait_mem_ready();
csl();
count_buffer ? spi(0x53) : spi(0x55);
spi((unsigned char)(page_addr>>7));
spi((unsigned char)(page_addr<<1));
spi(0x00);
csh();
}

void init_buf_write(void)
/*
Инициализация процедуры записи в буффер
Адрес в буфере -> buffer_addr
Номер буфера -> count_buffer( 1->1; 0->2)
*/

{
// wait_mem_ready();
csl();
count_buffer ? spi(0x84) : spi(0x87);
spi(0x00);
spi((unsigned char)(buffer_addr>>8));
spi((unsigned char)(buffer_addr));
}


void init_series_read(void)
{
/*
Инициализация операции последовательного чтения
Адрес страницы -> PageAddr
Адрес внутри страницы -> buffer_addr
*/
wait_mem_ready();
csl();
spi(0x68);
spi((unsigned char)(page_addr>>7));
spi((unsigned char)((page_addr<<1)+(buffer_addr>>8)));
spi((unsigned char)(buffer_addr));

spi(0xFF);
spi(0xFF);
spi(0xFF);
spi(0xFF);
}

void SeriesWrite(char data)
/*последвательная запись данных в буффер*/
{
spi(data);
if(inc_addr()){
csh();
buffer_to_mem();
page_addr++;
count_buffer = !count_buffer;
init_buf_write();
}
}

void SeriesStrWrite(char* str,unsigned char n)
{
unsigned char index = 0;
while(n--){
spi(str[index++]);
if(inc_addr()){
csh();
buffer_to_mem();
page_addr++;
count_buffer = !count_buffer;
init_buf_write();
}
}
}

void SeriesStrRead(char* str, unsigned char n)
{
unsigned char index = 0;
while(n--){
str[index++] = spi(0);
}
}

void clr_block(unsigned int StartPage, unsigned int n)
/* стирание памяти блоками ПО 8 СТРАНИЦ
StartPage - страница первого стираемого блока
n - к-во стираемых блоков
СТИРАЕТСЯ ВЕСЬ БЛОК даже еслиStartPage не первая страница блока
*/
{
while(n--){
asm("wdr");
wait_mem_ready();
csl();
spi(0x50);
spi((unsigned char)(StartPage>>7));
spi((unsigned char)(StartPage<<1));
spi(0x00);
StartPage+=8;
csh();
}
}


char read_str(char* str, unsigned char n)
{
unsigned char index=0;

init_series_read();
asm("wdr");

while(n--){
str[index++]=spi(0);
if(inc_addr()){
page_addr++;
}
}
csh();
return(1);
}

char write_str(char* str, unsigned char n)
{

char index=0;
mem_to_buffer();

wait_mem_ready();

init_buf_write();

while(n--){
spi(str[index++]);
if(inc_addr()){
csh();
buffer_to_mem();
page_addr++;
count_buffer = !count_buffer;
mem_to_buffer();

wait_mem_ready();

init_buf_write();
}
}
if(buffer_addr)buffer_to_mem();
return(1);
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru