STM32L-DISCOVERY + FDD

Всё что нужно знать о Floppy Disk Drive:

Для того что бы подключить STM32L-DISCOVERY к FDD тебе понадобиться 4 провода и 2 джампера.

P.S: Время ночь, это моя первая заметка на данную тематику, особых познаний у меня нет, всё подробно расписано на тематических ресурсах, но на то что бы с этим разобраться пришлось потратить уйму времени.

С чего начать?

Если посмотреть распиновку разъема то все входы/выходы являются четными, нечетные ножки это земля (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" пинам.

На STM32L-DISCOVERY стоит контроллер STM32L152RBT6 в LQFP64 корпусе, в его даташите есть таблица "...pin definitions". Если в колонке "I/O structure" стоит "FT" (five-volt tolerant) значит на пин можно смело подавать 5в.

Вообще, можно согласовать логические уровни, для этого используют выход с открытым коллектором.

Open-drain (открытый сток, аналог открытого коллектора): вывод подключен к стоку N-MOS полевика в то время, как P-MOS полевик заперт, что позволяет управлять нагрузкой с большим напряжением, чем Vdd (3.3 В).
Насколько я понял из статьи STM32: Урок 4 - GPIO, необходимо после вывода ставить подтягивающий резистор, а я пока не в ладах со схемотехникой поэтому пошел другим путем.

Из подробного мануала нам известны логические уровни 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в нам хватит с головой для подачи логической единицы.

В идеале, для согласования логических уровней у устройств должна быть общая земля, поэтому я запитал STM32L-DISCOVERY прямо от дисковода.
На нем есть разъем ATX 1 пин +5v, 2 GND. Припеваем 2 проводка к плате дисковода и втыкаем в EXT_5V и GND на отладочной плате.

Как управлять 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 (в данном случае PA1-2) на вывод обычного логического сигнала, включаем тактирование порта вывода и 6 таймера общего назначения. Шины к которым они подключены можно посмотреть в даташите. Далее в бесконечном цикле крутим шаговый двигатель на 100 треков, то назад то вперед.

Магическая цифра 2096 это стандартная внутренняя частота работы данного контроллера (2,097 МГц). Если хотите подробнее, читайте:

blog comments powered by Disqus
сюда туда