Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вот вариант без использования enable:

Отправлено Леонид Иванович 14 сентября 2009, г. 18:45
В ответ на: байт состояния остальные нули отправлено пользователем Make_Pic 14 сентября 2009, г. 18:00

align=Top

subdesign Spi
(
Clk : input; -- тактовая частота
/RD, /WR, /CS, A0 : input; -- сигналы чтения, записи, выборки и адреса
D[7..0] : bidir; -- шина данных
MISO : input;
MOSI : output;
SCK : output;
)

variable
DIn[7..0] : tri; -- формирователи данных для шины
Rg[7..0] : dff; -- регистр данных
DivRg[7..0] : dff; -- регистр делителя
SpiDiv[7..0] : dff; -- делитель
DivOut, SpiClk : node; -- выход делителя
ShiftCnt[3..0] : dff; -- счетчик бит для сдвига
WrEn0, WrEn1 : node; -- сигналы записи
WrSnc1, WrSnc2, WrSnc3 : node; -- сигналы синхронизатора
Shift : node; -- сигнал разрешения сдвига

begin

WrEn0 = !/CS & !/WR & !A0; -- разрешение записи в регистр данных
WrEn1 = !/CS & !/WR & A0; -- разрешение записи в регистр делителя
D[] = DIn[];
DIn[].oe = !/CS & !/RD; -- разрешение передачи на шину
if !A0 then DIn[].in = Rg[7..0]; -- чтение регистра данных
else DIn[].in = (0, !Shift); -- чтение регистра состояния
end if;

DivRg[] = D[];
DivRg[].clk = !WrEn1; -- запись регистра делителя
SpiDiv[].clk = Clk; -- тактирование делителя
SpiDiv[].clrn = Shift; -- сброс делителя
DivOut = SOFT(SpiDiv[] == DivRg[]); -- сравнение
if DivOut then SpiDiv[] = 0; -- обнуление делителя
else SpiDiv[] = SpiDiv[] + 1; -- счетчик
end if;

SpiClk = DFFE(!SpiClk, Clk, , , DivOut); -- формирование меандра
SCK = Shift & !SpiClk; -- формирование SCK
MOSI = Rg[7]; -- передача старшим битом вперед

if Shift
then
Rg[].d = (Rg[6..0], MISO); -- ввод данных с MISO
Rg[].clk = !SCK; -- тактирование сдвига
else
Rg[7..0].d = D[];
Rg[].clk = !WrEn0; -- запись регистра данных
end if;

ShiftCnt[].d = ShiftCnt[]+1; -- счетчик бит
ShiftCnt[].clk = !SCK; -- тактирование
ShiftCnt[].clrn = Shift; -- сброс счетчика

WrSnc1 = DFF(WrEn0, Clk, , );
WrSnc2 = DFF(WrSnc1, Clk, , );
WrSnc3 = DFF(WrSnc2, Clk, , );
Shift = JKFF(WrSnc2 & !WrSnc3, ShiftCnt[] == 8, Clk, , );

end;


A0 = 0 - W/R регистр данных.
A0 = 1 - W регистр делителя, R регистр состояния.
В регистр делителя нужно грузить Kdiv / 2 - 1.
В регистре состояния мл. бит = 1 - готовность.
Для чтения нужно записать в рег. данных FF, дождаться готовности и считать рег. данных.


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 234:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru