Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » SPI интерфейс


SPI интерфейс

Сообщений 1 страница 21 из 21

1

Давно хочу понять как им пользоваться , но что то не получается! Помогите пожалуйста.
Я чтобы разобраться в протеусе набросал схему термометра. Датчик ТС-72.Спй пробовал и хардварный и софтварный. В конце концов попробывал пример из баскома.
Есть команда    var=Spimove(byte) , uгде var - переменная, в которую счит-ся инфа из шины SPI, а Byte - константа или адрес( в моем случае это адрес регистра где храниться температура) -  я так понял. Пробовал использовать SPIIN - считывание из SPI, SPIOUT - передача в SPI. Но чтото никак не работает. по SPI дебаггеру вижу, что в шину отправляется байт с адресом, а обратно или нуль или 255 идет и все(

--------------------------------------------------------------------------------------------------------------------------------------
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128

'init the spi pins
Spiinit

Dim B As Byte , Bfromslave As Byte
B = &H02

Do
  'send 1 byte
  Bfromslave = Spimove(b)
  Print Bfromslave ; " received from slave"
  'as an alternative you can send data and display the last received value
  '  Spiout B , 1
  '  Print Spdr ; " received from slave"
  Wait 1
Loop
End
--------------------------------------------------------------------------------------------------------------------------------------
Адрес регистра с температурой в датчике &H02(старший байт - целое значение) регистр статуса вроде не требуется особо конфигурировать! Время преобразования 150мс
пробовал этот код:
----------------------------------------------------------------------------
Dim addres as byte, temperatura as byte
addres = &h02

spiinit
spiout addres, 1  'отправляю байт адреса регистра температуры
waitms 150
Spiin temperatura, 1 'получаю значение температуры
----------------------------------------------------------------------------

Тоже не работает, вобщем сижу туплю, не пойму никак.

увеличить

0

2

подтянуть на +5V  ножку SS

0

3

dmm написал(а):

подтянуть на +5V  ножку SS

Ды тоже самое....255 показывает!

Может есть у кого готовый пример работы с каким нибудь датчиком с кодом и схемкой в протеусе? Или просто код..ЕЩе: на картинке правильно подключены соответствующие выводы!?

Отредактировано Роман (2010-12-10 16:07:56)

0

4

у atmela неважный SPI-интерфейс:
- не дает особых преимуществ по сравнению с программным не экономит время и код, разве что, когда нужно "щелкать" очень медленно;
- имеет гнусную функцию (неотключаемую), когда режим мастер переключается в слэйв самостоятельно по низкому уровню на линии SS.
т.е. эту линию нельзя использовать, как ты сделал, для выбора кристалла;
- наелся проблемами HW SPI еще с at89S53. никогда не применяю и не советую. Также как и как мастер режим I2C.

0

5

Ды  пробывал програмный тоже, нигде еще не найду нормальных примеров работы с каким либо датчиком по спи(...Когда в протеусе делаю пошагово выполнение программы, с  выхода датчика вообще нет сигнала.

Програмный так настроил:
Config Spi = Soft , Din = Pinb.0 , Dout = Portb.1 , Ss = Portb.2 , Clock = Portb.3

0

6

быстро работающее пишется на ассемблере

Код:
'----------------------------------------------
'записать два байта в регистр AD5543 из регистра Wadr
!Out_d2b:
    Lds R0 , {wadr + 1}
    Rcall Out_d1b                       'записать старший байт в регистр AD5543
    Lds R0 , {wadr}
                                        'записать младший байт в регистр AD5543
'записать байт в регистр AD5543 из регистра R0 старший вперед
Out_d1b:
$asm
    Ldi R30 , 8                         'ЧИСЛО БИТ
O_d1b0:
    Rol R0                              'ЦИКЛ ПЕРЕДАЧИ
    Brcs O_d1b1                         'СДВИГ
    Cbi Portd , 4                       'порт (линия SDD) в "0"
    Rjmp O_d1b2
O_d1b1:
    Sbi Portd , 4                       'порт (линия SDD) в "1"
O_d1b2:
    Sbi Portd , 3                       'ИМПУЛЬС НА ЛИНИИ SCD
    Dec R30                             '     --
    Cbi Portd , 3                       '    ¦  ¦
    Brne O_d1b0                         '----    ----
    Ret
$end Asm
'----------------------------------------------
'программа загрузки ЦАП
Ld_amp:
$asm
    CLI                                 'запретить прерывания, чтобы не было "паразитной" записи в прерывании
    Cbi Portd , 6                       'выбрать кристал ЦАП
    Rcall Out_d2b                       'записать два байта в регистр AD5543 из регистра Wadr
    Sbi Portd , 6                       'ИМПУЛЬС НА ЛИНИИ CS
    SEI
    ret
$end Asm

если скорость не критична

Код:
'---------------------------------------
'загрузить ЦАП AD5543 
Lo_daca:
    Reset Portb.2                       'CS1
    Shiftout Portb.0 , Porte.7 , Wadr , 0   'выдаём данные на ЦАП A (SD1, SC1)
    Set Portb.2                         'CS1
Return

считывать аналогично

+1

7

Ок, спасибо,а тогоже только с применением операторов Bascom для работы с SPI нету?

0

8

Роман: Ок, спасибо,а тогоже только с применением операторов Bascom для работы с SPI нету?

  Рома, а в чем проблемы? Я вот тоже с SPI раньше имел дело только в одном случае - при программировании в системе и вне.Сейчас осваиваю TFT-компаньон и работаю на программном SPI,но я - материалист в материальном и проверяю BASCOM-AVR 2.0.0.0 на макете и запоминающем осциллоскопе GDS-71062, поскольку у Марка Альбертса бывают ошибки, я лично нашел две. Все пашет, только нужно правильно установить фазировку сигналов - запоминание идет по нарастающему или спадающему фронту CLCK , ввод - по SPIIN(четко видны байты из девайса), вывод - по SPIOUT(четко видны байты в девайс).HARDSPI я не использую - при программировании в системе он вышибает все, что подключено к нему,кроме MK.

Отредактировано user2007 (2010-12-15 17:46:13)

0

9

user2007 написал(а):

у Марка Альбертса бывают ошибки, я лично нашел две

а конкретно в чем заключаются ошибки? примеры есть, или из пустого в порожнее?

0

10

Дак вот вся проблема похоже в том, что я не могу правильно построить алгоритм программы...Блин если не сложно так, помоги пожалуйсто, напиши пример  хотябы для работы  с датчиком температуры (ТС-72), чтоб мне разобраться как правильно работать с командами, и заодно в протеусе моделить...а дальше уж сам...Понимаю что балбес...но не найду дельного примера, даже в книге по баском нет....ото уже месяца 2 бьюсь над SPI...буду примного благодарен

0

11

попробуйте почитать это http://www.google.ru/search?ie=UTF-8&hl=ru&q=bascom spi&redir_esc=y&ei=cQEJTefVBYGZ8QPM3tU2

0

12

Здравствуйте дорогие формчаны. Чтобы не создавать новую тему (что я не умею) если никто не возражает, решил продолжать здесь.
   Очень нуждаюсь в помощи. Пожалуста помагите кто может. За ране всех блогадарю. Я не рускоязычный, по этому возможно я не коректно изложу саваю проблему, прозьба сильно не пиняйте. Понимаю что, пол ответа находится в правильно заданном вопросе. Нимного программировать научилсо в этомъ форуме. Особенно учился у sasha_1973  Александр.   За что ему агромнa блогадарю.
  Теперь у меня проблема. Пытаюсь программно связать две микросхеме по SPI протоколу, использовая PCINT18 на стране slave, использовая перривание по команде SPI. К славе подключон ЛСД дисплей. Что должно печатать принимаемые и передаваемые данные. Сам slave процессор атмега168p_32p далжно прибавить к принимаемые данные число, и отправить данные назад масдеру. Собствененно проблема в том когда славе уходит но перривание запутывает все. Наверно я сам за сто лет не смогу решить эту проблему. Спасибо всем !!! 
Вот схема и исходник
https://cloud.mail.ru/public/A1o7/uwXm9zeLY

0

13

Связь 2 МК по SPI, закинул Вам на mail.

Отредактировано sasha_1973 (2016-07-05 18:58:27)

0

14

Спосибо!!! Заработал super

0

15

Пожалуйста.

0

16

Всем привет. Пытаюсь освоить SPI на bascom, тоже на ТС72. И тоже не получается прочитать показание регистра температуры.

Код:
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 80
$swstack = 80
$framesize = 100

Config Portb.4 = Output
select_pin Alias Portb.4
select_pin = 1

Declare Sub Writereg(byval Add_r As Byte , Byval V As Byte)    
Declare Function Readreg(byval Addr_s As Byte) As Byte       

Dim Temp as Byte, Temp1 as Byte

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1 , Spiin = 0
Spiinit


Do
Call Writereg(0,0)
Temp = Readreg(2)
Temp1 = Readreg(3)
wait 1
Loop

End


Function Readreg(byval Addr_s As Byte) As Byte
select_pin = 0
Addr_s.7 = 0
Spiout Addr_s , 1
Spiin Readreg , 1
select_pin = 1
End Function

Sub Writereg(byval Add_r As Byte , Byval V As Byte)
select_pin = 0
Add_r.7 = 1
Spiout Add_r , 1
Spiout V , 1
select_pin = 1
End Sub

Если кто юзал, подскажите, пож. А если есть рабочий пример обмена между МК на bascom, то это вообще супер.

0

17

С СПИ не работал, но сейчас посмотрел описание.

Чтобы подчиненное устройство знало, что работают именно с ним, контроллер должен просадит его линию SS к земле.

NOSS: отключает линию SS в случае если она не используется. Это необходимо например, когда к ведущему подключается более одного ведомого устройства. Для этого ставим NOSS=1 (линия SS теперь не будет автоматически прижиматься к 0), а в качестве SS1, SS2, SSn устанавливаем свои пины для работы с ведомыми устройствами. И когда нужно будет пообщаться с каким-либо устройством, вручную ставим на его линии SS низкий уровень. После окончания общения незабываем снова ставить высокий уровень

Может в этом беда?

0

18

Нет... Сейчас вместо термометра подключил ЦАП AD5621, всё работает. Но В этом ЦАПе ничего читать не нужно, только отправлять в него значения.
Получается что то с приёмом не то.  Я неправильно использую похоже эту функцию - Spiin, но всё как в даташите вроде бы. Но факт остаётся фактом в термометр данные приходят, а ответа нет

0

19

K_o_nstantin написал(а):

в термометр данные приходят

Откуда такая уверенность?

0

20

K_o_nstantin написал(а):

подключил ЦАП AD5621

У него нет вывода SS. Поэтому нет разницы, высокий будет уровень или низкий.

0

21

Как же нет (SYNC -  When SYNC goes low, it enables the input shift register, and data is transferred in on the falling edges of the clocks that follow. ).  Я уверен что с SS всё в порядке, потому что на эмуляторе смотрю и SPI Debugger. Данные приходят.http://forumfiles.ru/uploads/0000/25/b8/2064/t90759.jpg

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » SPI интерфейс