Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
19.11.2007, 20:40
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Код:
|
void AD8402(char PotNum,char Data)
{
int Cnt;
Cnt=2; // Выводим два бита адреса (номер потенциометра)
SS1=0; // Передача начата
while(Cnt)
{
MOSI=PotNum & 0b10;
SCK=1; // Тактируем
delay_us(50);
SCK=0;
PotNum ‹‹=1; // Сдвигаем влево на 1 бит
Cnt--;
} |
Это как раз таки программная реализация протокола, а не аппаратная!
А хелп пересмотрел, и не нашел описания дебагера...
|
|
|
|
20.11.2007, 00:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от dimonbest
|
Это как раз таки программная реализация протокола, а не аппаратная!
|
А в начале поста НЕ ВИДНО вот это ???
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
20.11.2007, 00:26
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Задача 7, в которой реализован аппаратный SPI, использует память от ATMEL, которой нет в протеусе. По этому мне еще неизвестно, нормально работает аппаратный SPI в протеусе или нет!!!
Прикрепленный файл: 5118261.rar
|
|
|
|
21.11.2007, 17:22
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
С этим еще никак не разобрался:
Вот код из даташита
Код:
|
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1‹‹DD_MOSI)|(1‹‹DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1‹‹SPE)|(1‹‹MSTR)|(1‹‹SPR0);
}
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1‹‹SPIF)))
;
}
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1‹‹DD_MISO);
/* Enable SPI */
SPCR = (1‹‹SPE);
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1‹‹SPIF)))
;
/* Return data register */
return SPDR;
} |
Но при передаче байта от мастера к слейву, мастер должен получать байт, а в примере не написано как его получать. Аналогично слейв: при приеме байта должен байт передавать мастеру, а в примере тоже не написано как. Буду благодарен за совет...
|
|
|
|
21.11.2007, 18:09
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от dimonbest
|
Но при передаче байта от мастера к слейву, мастер должен получать байт, а в примере не написано как его получать. Аналогично слейв: при приеме байта должен байт передавать мастеру, а в примере тоже не написано как. Буду благодарен за совет...
|
Два регистра данных - мастера и слейва - соединены в кольцо (хотя и не обязательно! от слейва можно и не подключать).
И при 8 стробах регистры данных обмениваются между собой. То есть мастер получит тот байт, который слейв записал в свой регистр данных. Как правило, это делается в прерывании - получил от мастера - записал свой. Но учтите - что в результате этот байт мастер получит только при СЛЕДУЮЩЕМ обмене.
|
|
|
|
21.11.2007, 19:59
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от nml
|
И при 8 стробах регистры данных обмениваются между собой.........Но учтите - что в результате этот байт мастер получит только при СЛЕДУЮЩЕМ обмене.
|
Не совсем понятно... Сразу будет обмен байтами, или мастер получит только при следующей посылке? Почему?
И еще:
Код:
|
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1‹‹SPIF)))
;
} |
Судя по примеру, мастер будет передавать байт cData. А как принять байт от слейва?
Так?
Код:
|
char SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1‹‹SPIF)))
;
return SPDR;
} |
|
|
|
|
21.11.2007, 22:52
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от dimonbest
|
Не совсем понятно... Сразу будет обмен байтами, или мастер получит только при следующей посылке? Почему?
|
Так... Еще раз (и смотрите на рисунок вначале темы). Мастер пишет в регистр данных - начинается сдвиг. Регистры данных мастера и слейва меняются местами. По окончании сдвига - прерывание в обоих, ну или факт окончания обмена по флагам, не суть.
Допустим слейв получил что-то, обдумал, и пишет ответ - то есть байт в регистр данных. Но это еще не значит что мастер его получил. Лежит оно в своем регистре, пока не начнется следующий цикл обмена. А его инициирует только мастер!
|
|
|
|
22.11.2007, 01:01
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Получается так: если слейв знает, что ему отсылать во время приема байта от мастера, то он это значение должен поместить в дата регистр. При этом за 8 тактов от мастера, значение дата регистра получит слейв, одновременно свое значение дата регистра отдаст мастеру. Я правильно все понял?
|
|
|
|
22.11.2007, 01:03
|
|
Прохожий
Регистрация: 25.10.2007
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
dimonbest, уважаемый mnl имеет в виду что ответную инфармацию ты получиш только на следующем цикле. Потому что сразу м/к ее не успеет обработать. НО... Если ты заранее подготовил данные для пересылки ты их просто пишеш в SPDR и ждеш когда master начнет передачу. Короче в принцепе ты все правельно понял. ![Валяюсь от смеха](images/smilies/icon_biggrin.gif) . Т.е. порсто отсылаеш 0 от ведущева к ведомому. Теперь о тех кодах из ds. Сказано же читай внимательно.... Так вот там же прописано что чтобы принять master_ом то по окончанию цикла (наличее флага) читай снова SPDR. А ds писали как пример для реализации оных функций. Еще раз напомню что регистр SPDR- это буфер между сдвиговым регистром (кольцевым) совместно с троиной буферизацией (одним на передачу оставшиеся на прием). Да и еше... прирывание это хороше когда есть запас по скорости, если его нет...!!!??? ТОгда не надо. Короче считать по времени надо. Вот с протеусом извени я както больше с паяльником. Сколько раз убеждался. Пишеш одно, а на выходе другое.
|
|
|
|
22.11.2007, 01:25
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Zhyk_k_k , nmlспасибо за помощь, с этим разобрался!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Протокол CANopen???
|
phoenix84 |
Proteus, KiCAD и другие ECAD |
4 |
20.03.2012 18:13 |
протокол C-Bus
|
magneat |
Микроконтроллеры, АЦП, память и т.д |
0 |
23.09.2008 20:44 |
Протокол Атлас-3
|
spin722 |
Автоматика и аппаратура связи |
7 |
20.09.2008 16:40 |
Протокол Wiegand
|
Beduin |
Микроконтроллеры, АЦП, память и т.д |
0 |
05.06.2007 16:39 |
протокол
|
sergey2000 |
Микроконтроллеры, АЦП, память и т.д |
1 |
28.05.2006 10:55 |
Часовой пояс GMT +4, время: 17:56.
|
|