Сопряжение цифрового потенциометра с МК по SPI. Вопрос.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сопряжение цифрового потенциометра с МК по SPI. Вопрос.

Сообщение prw07 »

Пытаюсь передать любое значение на потенциометр, но он ничего не воспринимает.
Пробовал разные режимы и частоты, но увы...
Кто-нибудь может подсказать в чем дело?

Во вложении проекты на CVAVR, Proteus и даташит на потенциометр.

Код: Выделить всё

#include <mega8.h>
#include <spi.h>

void SPI_MasterTransmit(char cData)
{
/* Запуск передачи данных */
SPDR = cData;
/* Ожидание завершения передачи данных */
while(!(SPSR & (1<<7)));  
};

void main(void)
{

PORTB=0x00;
DDRB=0xFF;

ACSR=0x80;
SFIOR=0x00;

SPCR=(1<<6)|(1<<4)|(1<<0);     //SPI Enable , Master, Fck/16;


while (1)
      {
 SPI_MasterTransmit(15);  

       };
}
Вложения
SPI.rar
(48.23 КБ) 156 скачиваний
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Engineer_Keen »

МК должен опускать линию CS потенциометра в 0 во время передачи данных. Обновление позиции среднего вывода потенциометра происходит по переднему фронту импульса на CS.
Реклама
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Леонид Иванович »

Вот так никогда не пишите,

Код: Выделить всё

SPCR=(1<<6)|(1<<4)|(1<<0);     //SPI Enable , Master, Fck/16;
ведь есть имена битов:

Код: Выделить всё

SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение prw07 »

Изначально я так и писал, но CVAVR выдает ошибку "неизвестная переменная". Поэтому приходится указывать номера битов, а не их название.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Engineer_Keen »

Выделите какую-нибудь ногу порта под CS, при инициализации оставьте ее в 1. Перед "SPDR = cData;" переведите ее в 0, а после "while(!(SPSR & (1<<7)))" верните ее в 1.
Реклама
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение prw07 »

ЗАРАБОТАЛО!!!!!!!!

Объясните в чем фишка и почему нужно выставляь 0 наCS# именно перед посылкой данных , а не постоянно ?
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Engineer_Keen »

Читайте внимательно про интерфейс SPI вообще и даташит на потенциометр в частности. Там же черным по белому написано на странице 10 "CS - вход выбора кристалла; активный 0. Когда CS возвращается в 1, данные загружаются в wiper-регистр (регистр положения среднего отвода)" Как он обновится, если на CS всегда будет 0?
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Леонид Иванович »

prw07 писал(а):CVAVR выдает ошибку "неизвестная переменная"
Нужно подключить необходимые h-файлы, где описаны биты регистров. В CVAVR не работаю, не знаю, как там он называется. В IAR это ioavr.h, который подключает файл выбранного в проекте контроллера, например, iom8.h.
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение prw07 »

Читайте внимательно про интерфейс SPI вообще и даташит на потенциометр в частности. Там же черным по белому написано на странице 10 "CS - вход выбора кристалла; активный 0. Когда CS возвращается в 1, данные загружаются в wiper-регистр (регистр положения среднего отвода)" Как он обновится, если на CS всегда будет 0?
Огромное спасибо за то, что не поленились прочитать за меня и помогли. Я по аглицки не очень-то.
P.S. Не работало через SS# SPI интерфейса наверное тоже по этой причине?
Нужно подключить необходимые h-файлы, где описаны биты регистров. В CVAVR не работаю, не знаю, как там он называется. В IAR это ioavr.h, который подключает файл выбранного в проекте контроллера, например, iom8.h.
В самом начале подключается библиотека "mega8.h". И это ничего не дает. Может еще какая-то библиотека должна быть специально для имн регистров, но этого я не знаю.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Engineer_Keen »

prw07 писал(а):P.S. Не работало через SS# SPI интерфейса наверное тоже по этой причине?
SS работает аппаратно в SPI в режиме slave. В режиме master он не отличается от остальных портов, его нужно дергать программно.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Леонид Иванович »

prw07 писал(а):В самом начале подключается библиотека "mega8.h". И это ничего не дает
А кто мешает посмотреть, что внутри этого файла?
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение mr_smit »

Надо было просто воспользоваться мастером кода в CVAVR. Он сам добавит нужные заголовочные файлы:

Код: Выделить всё

// SPI functions
#include <spi.h>
А вся инициализация SPI свелась бы к:

Код: Выделить всё

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2*2000,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x01;
Ну а дальше как вам и сказали:

Код: Выделить всё

void SPI_MasterTransmit(char cData)
{
CS = 0;
SPDR = cData;
while(!(SPSR & (1<<7))); 
CS = 1;
};
Нельзя всё знать, достаточно понимать.
prw07
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение prw07 »

Вот нашел библиотеку m8_128.h для CVAVR подключив которую можно обращаться к именам битов регистров. Для "тини" можно по анологии сделать.
Надо было просто воспользоваться мастером кода в CVAVR. Он сам добавит нужные заголовочные файлы:
Я им и воспользовался, но CS все-равно программно ставить нужно. Вчера в шите на мегу об этом вычитал.

Всем спасибо.
Пока в протеусе все работает. Осталось в железе реализовать.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Леонид Иванович »

[quote="mr_smit"]Ну кто Вас учил так писать:

Код: Выделить всё

SPCR=0x50;
SPSR=0x01;

while(!(SPSR & (1<<7))); 
Что такое 0x50, 0x01, 7? Исходник совершенно нечитаем.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Мастер Ломастер »

Ничегонеработает писал(а):Что такое 0x50, 0x01, 7? Исходник совершенно нечитаем.
зато сгенерирован визардом. и вообще, исходники читать, а тем более писать - это не для настоящих пацанов занятие.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Engineer_Keen »

Ничего криминального в том, что в коде используются "магические числа" не вижу, ну да - сразу непонятно как настроено, зато строчка кода короче :))) Сам когда только начинал писать на асме так всегда делал и даже не отдельными битами типа (1<<6)|(1<<4), а тупо числами 0х48, когда даташит под рукой (а тем более авр-студия - там все регистры и биты видно) не влом в него залезть и посмотреть какой бит за что отвечает. Теперь конечно использую имена. Тем более выяснилось что у топикстартера просто проблема с h-файлом.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6317
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Сопряжение цифрового потенциометра с МК по SPI. Вопро

Сообщение Jack_A »

Ничегонеработает писал(а):
mr_smit писал(а):Ну кто Вас учил так писать:

Код: Выделить всё

SPCR=0x50;
SPSR=0x01;

while(!(SPSR & (1<<7))); 
Что такое 0x50, 0x01, 7? Исходник совершенно нечитаем.
Краткий комментарий сразу все разъяснил бы. В случае вида
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0) он тоже не был бы лишним, чтобы для понимания не расшифровывать аббревиатуры. Другое дело, что модифицировать исходник с символьными именами легче.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»