Всё что нужно знать о Floppy Disk Drive
P.S: Время ночь, это моя первая заметка на данную тематику, особых познаний у меня нет, всё подробно расписано на тематических ресурсах, но на то что бы с этим разобраться пришлось потратить уйму времени. В планах сделать из дисковода RTTTL плеер.
С чего начать?
Если посмотреть распиновку разъема то все входы/выходы являются четными, нечетные ножки это земля (GND). На дисководе должен быть зазор, что бы правильно вставить шлейф, переверни девайс зазором вниз, верхняя левая ножка это 2.
Поставь джампер на 12-11 ножки («Drive Sel B» с GND) загорится светодиод на передней панели дисковода, далее джампер на 16-15 («Motor Enable B» с GND) диск начнет крутится.
Логические уровни TTL
In anycase the floppy interface used 5v TTL as the electrical interface, which would also comply with LVTTL switching levels.
На выходах отладочной платы логическая единица это 3.3в, а FDD интерфейс использует 5в, это означает, что подключать FDD нужно к «5v tolerant» пинам. Что бы их найти, достаточно открыть даташит контроллера STM32L152RBT6, который установлен на STM32L-DISCOVERY и посмотреть таблицу с названием "...pin definitions". Если в колонке «I/O structure» стоит «FT» (five-volt tolerant) значит на пин можно смело подавать 5в.
Из подробного мануала нам известны логические уровни TTL
An Input high voltage of 2.0 volts and and input low voltage of 0.8 volts.
An Output high voltage of 2.4 volts and and input low voltage of 0.5 volts.
это означает что 3.3в нам хватит с головой для подачи логической единицы.
В идеале, для согласования логических уровней у устройств должна быть общая земля, поэтому я запитал отладочную плату прямо от дисковода.
На дисководе есть стандартный разъем питания.
Припеваем два проводка к плате дисковода (на 1 и 2 пин) и втыкаем в EXT_5V и GND на STM32L-DISCOVERY.
Как управлять FDD?
Для управления шаговым двигателем дисковода используется 2 пина, 18 DIR «Direction» и 20 STEP «Step».
Сначала нужно задать направление движения подав LOW (0) или HIGH (1) на DIR, а после этого сдвинуть головку на один трек:
Step=LOW
Delay(1mS)
Step=HIGH
Пишем тестовую прошивку
#include "stm32l1xx.h"
#include "stm32l1xx_rcc.h"
#define DIR GPIO_Pin_1 // 18 // PA1
#define STEP GPIO_Pin_2 // 20 // PA2
void delay_ms(uint32_t delay)
{
TIM6->PSC = 2096;
TIM6->ARR = delay;
TIM6->EGR |= TIM_EGR_UG;
TIM6->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;
while ( (TIM6->CR1 & TIM_CR1_CEN) != 0);
}
void InitPeriph()
{
GPIO_InitTypeDef GPIOConfig;
GPIOConfig.GPIO_Speed = GPIO_Speed_40MHz;
GPIOConfig.GPIO_Mode = GPIO_Mode_OUT;
GPIOConfig.GPIO_OType = GPIO_OType_PP;
GPIOConfig.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIOConfig.GPIO_Pin = DIR | STEP;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
GPIO_Init(GPIOA,&GPIOConfig);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
}
void move()
{
GPIO_ResetBits(GPIOA,STEP);
delay_ms(1);
GPIO_SetBits(GPIOA,STEP);
}
int main()
{
int i;
InitPeriph();
for(;;)
{
GPIO_ResetBits(GPIOA,DIR);
for(i=0;i<100;i++)
{
move();
}
delay_ms(1000);
GPIO_SetBits(GPIOA,DIR);
for(i=0;i<100;i++)
{
move();
}
delay_ms(2500);
}
}
Настраиваем порты GPIO на вывод обычного логического сигнала, включаем тактирование порта вывода и 6 таймера общего назначения. Шины к которым они подключены можно посмотреть в даташите. Далее в бесконечном цикле крутим шаговый двигатель на 100 треков, то назад то вперед.
Магическая цифра 2096 это стандартная внутренняя частота работы данного контроллера (2,097 МГц).
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий