Author |
Message |
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Ну вот как обещал - занялся 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 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Целую субботу потратил, чтоб сделать адаптер к CF!
Хлорное железо старое, травилось долго.
Иглой вычищал между дорожками - ИЗВРАТ!!!
Вот CF-Board:
|
22 Apr 2007 19:05 |
|
|
CHRV
God
Joined: 29 Dec 2003 01:00 Posts: 1101 Location: Москва
|
Ужос - скоро будет экспериментальная серия адаптеров от НедоПС CF-IDE40-IDE44
|
22 Apr 2007 23:31 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Круть!
|
23 Apr 2007 06:05 |
|
|
Different
Doomed
Joined: 18 Feb 2007 11:40 Posts: 408
|
Обратите внимание, как пролегли дорожки на плате.
Древо познания практически. Через тернии к контактам.
|
23 Apr 2007 09:26 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Одного только не пойму - нафига столько контактов делать с CF?
Оставили бы один IDE(ATA)-режим и забили на всё остальное!
16-бит данные, 3-бита адрес ну и плюс несколько управляющих...
Даже такая конфигурация отлично вписывается в интерфей внешней памяти. Много контактов не используются - занулены, подтянуты к питанию или вообще висят.
Будет время - обязательно вложу схему подключения...
|
23 Apr 2007 18:19 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
А я недавно на ebay.com приобрёл парочку адаптеров CF2IDE (мама - т.е. для втыкания непосредственно в мать) по 5 баксов штучка:
По идее по фоткам печатной платы можно попытаться восстановить схему
|
23 Apr 2007 19:47 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
А я делал эмуль винта на CF для ноута.
CF на 512Мб успешно работает в 486ом ноуте на работе в связке с PTS-DOS 32.
Эх ты, не шаришь в колбасных обрезках! Это же АТА разъем! Только для носимой аппаратуры. CF - это только накопитель, а вообще там можно подтыкать любые девайсы: сетевушки, накопители и микродрайвы, USB хосты и т.д. Знакомые девайсы для Пальмов? А эти "зануленные" контакты конкретно у CF - старшие адреса, ибо при включении режима True IDE старшие адреса зануляются. Это в доке на CF дано, если у кого нету - могу дать, если тут не выкладывал.
|
24 Apr 2007 06:40 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Ну это я знал! Просто считаю, что при приведении к стандарту не следует сваливать всё в одну большую свалку! Биты a3..a10 точно нафиг выкинуть можно - всеравно все одновременно не используются
|
24 Apr 2007 17:11 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
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 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Испробовал в живую на PowerMac G3 - работает
|
13 Jun 2009 13:26 |
|
|