nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 17 Apr 2024 18:37



Reply to topic  [ 11 posts ] 
Работа с Compact Flash 
Author Message
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Ну вот как обещал - занялся CF'ками. Успешно читается/пишется :)
Пример кода:
Code:

/*
Пример псевдо-подпрограмм для работы с Compact Flash(CF) в True IDE Mode (16 bit Data Bus)
Общение с CF через порты ввода/вывода микроллера
Используемая CF: Nikon EC-8CF 8MB HITACHI
Для большей производительности рекомендуется подключить CF к интерфейсу внешней памяти микроллера
*/

void Address(unsigned char _) //Установка адреса
{
 <установка/сброс битов I/O порта, отвечающих за установку адреса регистра ATA(IDE)>
}

void CE1(unsigned char _) //Чипселект ¹1
{
 <установка/сброс бита I/O порта, отвечающего за CE1>
}

void CE2(unsigned char _) //Чипселект ¹2
{
 <установка/сброс бита I/O порта, отвечающего за CE2>
}

void IORD(unsigned char _) //Строб чтения
{
 <установка/сброс бита I/O порта, отвечающего за чтение CF>
}

void IOWR(unsigned char _) //Строб записи
{
 <установка/сброс бита I/O порта, отвечающего за запись CF>
}

void OutDataPort(unsigned short int d) //Запись в 16-битный регистр данных ATA(IDE)
{
 CE2(1);
 CE1(0); //Разрешаем работу с CF
 Address(0); //0-й регистр
 <Далее пишем в порты данных старший и младший байты d>
 <порт вывода Low>=d; //пишем младший байт
 <порт вывода High>=(d>>8); //пишем старший байт
 IOWR(0); //строб записи в 0 - разрешаем запись
 IOWR(1); //строб записи в 1 - запрещаем запись
 CE2(1); //Запрещаем работу с CF
 CE1(1);
}

unsigned short int InDataPort(void) //Чтение 16-разрядного регистра данных ATA(IDE)
{
 unsigned short int r;
 CE2(1);
 CE1(0); //Разрешаем работу с CF
 Address(0); //0-й регистр
 <настраиваем порты данных на ввод>
 IORD(0); //строб чтения в 0 - разрешаем чтение
 <Далее читаем порты данных(младший и старший байты) и формируем значение r>
 r=<сформированное значение>
 IORD(1); //строб чтения в 1 - запрещаем чтение
 <настраиваем порты данных на вывод>
 CE2(1); //Запрещаем работу с CF
 CE1(1);
 return r;
}

void OutPort(unsigned char a,unsigned char d) //Запись данных в регистр ATA(IDE)
{
 CE2(1);
 CE1(0); //Разрешаем работу с CF
 Address(a); //Адрес регистра
 <порт вывода>=d; //Данные
 IOWR(0); //строб записи в 0 - разрешаем запись
 IOWR(1); //строб записи в 1 - запрещаем запись
 CE2(1); //Запрещаем работу с CF
 CE1(1);
}

unsigned char Status(void) //Возвращает состояние CF
{
 unsigned char r;
 CE2(0); //Разрешаем работу с CF
 CE1(1); //АЛЬТЕРНАТИВНЫЙ РЕГИСТР СТАТУСА ATA(IDE) С обычным ничё не выйдет!
 Address(6); //6-й регистр
 <настраиваем порт данных на ввод>
 IORD(0); //строб чтения в 0 - разрешаем чтение
 r=<порт ввода>; //Читаем
 IORD(1); //строб чтения в 1 - запрещаем чтение
 <настраиваем порт данных на вывод>
 CE2(1); //Запрещаем работу с CF
 CE1(1);
 return r;
}

unsigned char Buffer[512]; //Буфер сектора

void InSector(unsigned long Sector) //Чтение сектора
{
 unsigned short int i;
 OutPort(6,(Sector>>24)|0xE0); //LBA 24..27 Используем LBA вместо CHS
 OutPort(5, Sector>>16);       //LBA 16..23
 OutPort(4, Sector>> 8);       //LBA  8..15
 OutPort(3, Sector    );       //LBA  0.. 7
 OutPort(2,1);                 //One Sector
 OutPort(7,0x20);              //Read Sector(s) Command
 while(!((Status()>>3)&1));    //Ждём подготовки данных CF
 for(i=0;i<512;i+=2) *(unsigned short int*)(Buffer+i)=InDataPort(); //Читаем сектор в буфер
 while((Status()>>7)&1);       //Ждём освобождения CF
}

void OutSector(unsigned long Sector) //Запись сектора
{
 unsigned short int i;
 OutPort(6,(Sector>>24)|0xE0); //LBA 24..27 Используем LBA вместо CHS
 OutPort(5, Sector>>16);       //LBA 16..23
 OutPort(4, Sector>> 8);       //LBA  8..15
 OutPort(3, Sector    );       //LBA  0.. 7
 OutPort(2,1);                 //One Sector
 OutPort(7,0x30);              //Write Sector(s) Command
 while(!((Status()>>3)&1));    //Ждём требования данных CF
 for(i=0;i<512;i+=2) OutDataPort(*(unsigned short int*)(Buffer+i)); //Пишем сектор из буфера
 while((Status()>>7)&1);       //Ждём освобождения CF
}

int main(void) //Пример: копируем нулевой сектор в первый
{
 <инициализируем I/O порты микроллера, настраиваем их на вывод первоначально>
 InSector(0);  //Читаем из нулевого сектора в буфер
 OutSector(1); //Пишем в первый сектор из буфера
}


22 Apr 2007 19:02
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
Целую субботу потратил, чтоб сделать адаптер к CF!
Хлорное железо старое, травилось долго.
Иглой вычищал между дорожками - ИЗВРАТ!!!
Image
Вот CF-Board:
Image


22 Apr 2007 19:05
Profile
God
User avatar

Joined: 29 Dec 2003 01:00
Posts: 1101
Location: Москва
Reply with quote
Post 
Romanich wrote:
Целую субботу потратил, чтоб сделать адаптер к CF!

Ужос - скоро будет экспериментальная серия адаптеров от НедоПС CF-IDE40-IDE44


22 Apr 2007 23:31
Profile ICQ WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22523
Location: Silicon Valley
Reply with quote
Post 
Romanich wrote:
Целую субботу потратил, чтоб сделать адаптер к CF!
Хлорное железо старое, травилось долго.
Иглой вычищал между дорожками - ИЗВРАТ!!!


Круть! :kruto:

_________________
:dj: https://mastodon.social/@Shaos


23 Apr 2007 06:05
Profile WWW
Doomed

Joined: 18 Feb 2007 11:40
Posts: 408
Reply with quote
Post 
Обратите внимание, как пролегли дорожки на плате.
Древо познания практически. Через тернии к контактам. :wink:


23 Apr 2007 09:26
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
Одного только не пойму - нафига столько контактов делать с CF?
Оставили бы один IDE(ATA)-режим и забили на всё остальное!

16-бит данные, 3-бита адрес ну и плюс несколько управляющих...
Даже такая конфигурация отлично вписывается в интерфей внешней памяти. Много контактов не используются - занулены, подтянуты к питанию или вообще висят.

Будет время - обязательно вложу схему подключения...


23 Apr 2007 18:19
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22523
Location: Silicon Valley
Reply with quote
Post 
А я недавно на ebay.com приобрёл парочку адаптеров CF2IDE (мама - т.е. для втыкания непосредственно в мать) по 5 баксов штучка:

Image

Image

По идее по фоткам печатной платы можно попытаться восстановить схему ;)

_________________
:dj: https://mastodon.social/@Shaos


23 Apr 2007 19:47
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
А я делал эмуль винта на CF для ноута.
Image
CF на 512Мб успешно работает в 486ом ноуте на работе в связке с PTS-DOS 32. ;)
Romanich wrote:
Одного только не пойму - нафига столько контактов делать с CF?
Оставили бы один IDE(ATA)-режим и забили на всё остальное!
16-бит данные, 3-бита адрес ну и плюс несколько управляющих...
Даже такая конфигурация отлично вписывается в интерфей внешней памяти. Много контактов не используются - занулены, подтянуты к питанию или вообще висят.
Будет время - обязательно вложу схему подключения...

Эх ты, не шаришь в колбасных обрезках! Это же АТА разъем! Только для носимой аппаратуры. CF - это только накопитель, а вообще там можно подтыкать любые девайсы: сетевушки, накопители и микродрайвы, USB хосты и т.д. Знакомые девайсы для Пальмов? А эти "зануленные" контакты конкретно у CF - старшие адреса, ибо при включении режима True IDE старшие адреса зануляются. Это в доке на CF дано, если у кого нету - могу дать, если тут не выкладывал.


24 Apr 2007 06:40
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
HardWareMan wrote:
Эх ты, не шаришь в колбасных обрезках! Это же АТА разъем!...

Ну это я знал! Просто считаю, что при приведении к стандарту не следует сваливать всё в одну большую свалку! Биты a3..a10 точно нафиг выкинуть можно - всеравно все одновременно не используются


24 Apr 2007 17:11
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Pin # Name Use
-----------------------
1 GND занулён
2 D3 d3
3 D4 d4
4 D5 d5
5 D6 d6
6 D7 d7
7 ~CS0 ~cs0
8 A10 занулён
9 ~ATA SE занулён
10 A9 занулён
11 A8 занулён
12 A7 занулён
13 VCC +3.3V
14 A6 занулён
15 A5 занулён
16 A4 занулён
17 A3 занулён
18 A2 a2
19 A1 a1
20 A0 a0
21 D0 d0
22 D1 d1
23 D2 d2
24 ~IOCS16 висит
25 ~CD2 висит
26 ~CD1 висит
27 D11 d11
28 D12 d12
29 D13 d13
30 D14 d14
31 D15 d15
32 ~CS1 ~cs1
33 ~VS1 висит
34 ~IORD ~iord
35 ~IOWR ~iowr
36 ~WE подтянут к +3.3V резистором 4.7kOhm
37 INTRQ пока не использую
38 VCC +3.3V
39 ~CSEL занулён
40 ~VS2 висит
41 ~RESET подтянут к +3.3V резистором 10kOhm и конденсатор 10uF на землю
42 IORDY пока не использую
43 ~INPAC висит
44 ~REG подтянут к +3.3V резистором 4.7kOhm
45 ~DASP висит
46 ~PDIAG висит
47 D8 d8
48 D9 d9
49 D10 d10
50 GND занулён

Видно, что для такого режима достаточно всего 28 контактов,
избавившись от нулёвок/подтяжек/висячек и лишних земель с питаниями :)


24 Apr 2007 17:13
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22523
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
А я недавно на ebay.com приобрёл парочку адаптеров CF2IDE (мама - т.е. для втыкания непосредственно в мать) по 5 баксов штучка:

Image

Image

По идее по фоткам печатной платы можно попытаться восстановить схему ;)


Испробовал в живую на PowerMac G3 - работает :)

Image

_________________
:dj: https://mastodon.social/@Shaos


13 Jun 2009 13:26
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 11 posts ] 

Who is online

Users browsing this forum: No registered users and 11 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.