Atmega8 и SPI 25 серии помогите разобраться

Обсуждаем контроллеры компании Atmel.
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

Здравствуйте коты :))!

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

Имеется контроллер Atmega8 - 16 au и микросхема памяти 25q64. Как я понял интерфейс spi в атмеге реализован на выводах порта В. Для чтения заранее записанных данных используется 4 вывода микросхемы памяти: DI вход, DO выход, /CS выбор чипа, CLk вход таковых импульсов.
Атмега меня сразу озадачила, я разобрался только, что mosi выход, miso вход (и это не точно).

Теперь первый и пока главный вопрос, с чем соединить вход таковых импульсов CLk микросхемы памяти, если из вариантов порта В нет CLk выход, зато есть вход. Да и /CS особо вариантов не нашёл.

Процессор планирую тактировать от кварца. Естественно ставить внешний тактовой генератор CLk импульсов на отдельной микросхеме совсем не хочется, да и при наличии кварца на проце как-то глупо. А тактовые импульсы нужны и микросхеме памяти и процессору. Объясните мне в чем я запутался.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение Ivanoff-iv »

почитай режимы мастер/слейв spi там тот кто мастер - тот генерирует такт, кто слейв - ловит (понятно, что мега будет мастером)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение uk8amk »

Соединение для SPI памяти:
MOSI -> DI
MISO <- DO
SCK -> CLK
CS -> CS

CS будет управляться программно, как обычный GPIO.
Если познания неглубокие, то сначала может быть проще сделать программную реализацию SPI, то есть самостоятельно дергать ножками для формирования нужных сигналов. Когда будет отлажен код взаимодействия и придёт понимание работы SPI, то уже можно будет задействовать аппаратный модуль.
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

почитай режимы мастер/слейв spi там тот кто мастер - тот генерирует такт, кто слейв - ловит (понятно, что мега будет мастером)


Вот что есть в даташите (перевод гугла):
"• SCK - порт B, бит 5
SCK: выход главного тактового сигнала, входной контакт ведомого тактового сигнала для канала SPI. Когда SPI включен в качестве ведомого, этот вывод
Настроен как вход независимо от настройки DDB5. Когда SPI включен как мастер, направление данных
Этого вывода контролируется DDB5. Когда SPI принудительно вводит вывод, подтягиванием можно управлять
Битом PORTB5."

Получается что когда этот бит настроен как мастер, то он будет сам такты выдавать?.

Мне просто понять хочется, если я конфигурирую порт В под spi интерфейс, то при правильной разводке схемы процессор сам разберется как ему данными обмениваться? или я не правильно понимаю))

Добавлено after 26 minutes 20 seconds:
Соединение для SPI памяти:
MOSI -> DI
MISO <- DO
SCK -> CLK
CS -> CS

CS будет управляться программно, как обычный GPIO.
Если познания неглубокие, то сначала может быть проще сделать программную реализацию SPI, то есть самостоятельно дергать ножками для формирования нужных сигналов. Когда будет отлажен код взаимодействия и придёт понимание работы SPI, то уже можно будет задействовать аппаратный модуль.


То есть СS мне нужно будет прижимать к земле(используя вообще любой порт?) перед чтением 1 бита данных? А затем обратно его инвертировать после получения результата? Или нужно использовать только вывод • SS/OC1B – Port B, Bit 2, тогда как я кварц туда подключу, ведь он будет им занят.


SCK это порт В 5 бит , вот что я перевел но не совсем понял формулировку, так как написано много, а перевод не корректный:
"• SCK - порт B, бит 5
SCK: выход главного тактового сигнала, входной контакт ведомого тактового сигнала для канала SPI. Когда SPI включен в качестве ведомого, этот вывод
Настроен как вход независимо от настройки DDB5. Когда SPI включен как мастер, направление данных
Этого вывода контролируется DDB5. Когда SPI принудительно вводит вывод, подтягиванием можно управлять
Битом PORTB5."

Если я правильно понял Вас и этот пунк даташита, то при конфигурировании порта под задачи spi на ножке процессора будет постоянно генериться сигнал тактирования (ну или в случае обращения к памяти). И влиять на этот процесс не нужно?
Еще мини вопрос, если я отдам весь порт В под микросхему памяти, а использовать для обмена буду только 4ре вывода, то можно будет использовать остальные выводы порта под другие задачи?

Извините за глупые вопросы. Хочется понять как работать с этим интерфейсом прежде чем я нарисую схему и запущу проект в avr studio.
Самсусамыч

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение Самсусамыч »

Получается что когда этот бит настроен как мастер, то он будет сам такты выдавать?.

Да.
Мне просто понять хочется, если я конфигурирую порт В под spi интерфейс, то при правильной разводке схемы процессор сам разберется как ему данными обмениваться? или я не правильно понимаю))

Порт В это 8 выводов, а под SPI задействовано лишь часть порта - 4 вывода…
Чтобы это понять необходимо ознакомится с даташитом или как работает SPI.

Вот описание на русском ATmega8_rus https://yadi.sk/i/eovPhxdEf5yRc со стр. 124 описание SPI
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

Вот описание на русском ATmega8_rus https://yadi.sk/i/eovPhxdEf5yRc со стр. 124 описание SPI


вот за это отдельное спасибо :) , понятно стало многое...

Теперь буду пробовать рисовать схему и сделаю наброски кода, то как я вижу весь процесс.
Надеюсь чуть позже покажу результаты. Если что ткнете меня в ошибки :)))
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение Demiurg »

Выводы микроконтроллера:
MOSI - Master Out Slave In, у МК выход.
MISO - Master In Slave Out, у МК вход.
CLK - Выход тактовых импульсов SPI МК.
_CS - это вход МК в режиме Slave. При этом, если пин настроен как вход, при низком уровне сигнала МК автоматически встает в режим Slave. Решение - настройка пина как выход. То есть запись 1 в DDRx. В этом случае вывод CS используется для управления подчиненного устройства.
Более подробно описано в описании по приведенной выше ссылке.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение NStorm »

Соединять элементарно - напрямую и всё, как написали.
Если вы на МК используете его SPI, т.е. аппаратную периферию - то конечно влиять не нужно. Разве что CS вручную "дернуть". Хотя вы его вообще можете не использовать, если у одна микросхема памяти будет на линии. Вы можете просто подтянуть его к нулю со стороны памяти.
Внешний кварц вам даже не нужен. Вполне можно использовать внутренний RC на 8 МГц атмеги8.
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

Соединять элементарно - напрямую и всё, как написали.
Если вы на МК используете его SPI, т.е. аппаратную периферию - то конечно влиять не нужно. Разве что CS вручную "дернуть". Хотя вы его вообще можете не использовать, если у одна микросхема памяти будет на линии. Вы можете просто подтянуть его к нулю со стороны памяти.
Внешний кварц вам даже не нужен. Вполне можно использовать внутренний RC на 8 МГц атмеги8.


То есть стабильности хватит на работу без кварца? Ну тогда это совсем замечательно. К сожалению пока не добрался до компьютера чтобы попробовать. Успел только в протеусе соединения сделать. Надо будет только согласовать уровни сигналов. А то мои микросхемы получаются с разным питанием. Надеюсь на резисторах собрать, в принципе разница в питании не такая уж и большая.

Добавлено after 6 minutes 59 seconds:
Выводы микроконтроллера:
MOSI - Master Out Slave In, у МК выход.
MISO - Master In Slave Out, у МК вход.
CLK - Выход тактовых импульсов SPI МК.
_CS - это вход МК в режиме Slave. При этом, если пин настроен как вход, при низком уровне сигнала МК автоматически встает в режим Slave. Решение - настройка пина как выход. То есть запись 1 в DDRx. В этом случае вывод CS используется для управления подчиненного устройства.
Более подробно описано в описании по приведенной выше ссылке.


Режим слейв меня вообще пока не интересует, это усложняет и без того сложную для меня задачу. В дальнейшем я возможно перейду на sd карточку. Но пока думаю для понимая процесса обмена данными необходимо изучить spi.
Задача контроллера будет заключаться в чтении заранее известных адресов, затем обработка бит данных, занесение в переменные и вывод результата вычисления на другой порт в виде последовательности сигналов.
А дамп я буду пока записывать на программаторе ch341
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение NStorm »

Надо будет только согласовать уровни сигналов. А то мои микросхемы получаются с разным питанием.

Если взять atmega8l/atmega8a, их можно запитать и на 3.3В и не надо будет ничего согласовывать.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение Demiurg »

Надо будет только согласовать уровни сигналов. А то мои микросхемы получаются с разным питанием.

Если взять atmega8l/atmega8a, их можно запитать и на 3.3В и не надо будет ничего согласовывать.

Нужно смотреть в даташитах, толерантны ли входы периферии к 5 вольтам. Хорошо, если показывают внутреннюю схему входов. Если на входах стоят диоды, однозначно потребуется согласование входов.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение NStorm »

Demiurg, если напруги питания у МК и слэйва одинаковые будут, то ничего не надо согласовывать. Я об этом писал. У 25q64 напруги афаир 2.7-3.6В, т.е. обычные 3.3В в среднем можно взять. Можно взять атмега8 с буквой L или A - у них 3.3В допустимое питание. Поэтому не надо будет согласовывать, 5В нигде не будет.
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

Скорее всего будет проц, которых у меня лежит с Китая 10 штук. А это atmega8-16au. Согласование уровней это не проблема. Проблема код и время на этот код. Разобраться хочу сам, поэтому даже не поднимаю такой вопрос чтобы кто-то писал за меня.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение Jack_A »

Вы можете просто подтянуть его к нулю со стороны памяти.

Крайне не советую. Можно иметь крупный нежданчик. Сам обжёгся когда-то.
Изображение
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

[uquote="NStorm",url="/forum/viewtopic.php?p=3788207#p3788207"]Вы можете просто подтянуть его к нулю со стороны памяти.

Крайне не советую. Можно иметь крупный нежданчик. Сам обжёгся когда-то.[/uquote]

Конечно я так делать не буду. Благодаря участникам форума я начитался мануалов и решил что spi буду использовать как есть без упрощение. Ведь мне нужен управляемый процесс доступа в ячейку памяти.

Добавлено after 3 minutes 15 seconds:
А на текущий момент я столкнулся с тем что оказывается нужно отправить команду на чтение одного байта + адрес + принять это все в переменную. Не могу по мануалу разобраться как именно записать команду в регистр данных, а главное какую команду.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение akl »

Что у Вас за мануал? В DS есть пример на ассемблере, да и на цэ тоже.

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

SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)
out DDR_SPI,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,r16
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

Что у Вас за мануал? В DS есть пример на ассемблере, да и на цэ тоже.

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

SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)
out DDR_SPI,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Start transmission of data (r16)
out SPDR,r16
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret


Это я видел и на С тоже видел. Всё же пример не жизнеспособен для меня пока не пойму назначение каждого слова. Не программист к сожалению. Пытаюсь писать в с++ в авр студии. Уровень моих познаний в этой студии это управление шаговыми двигателями при условии, и то вспоминать придётся что к чему :)))
Я пока разобрался с битами управления spi, не полностью но понял что там включать. А мануал у меня этот по ссылке из этой темы. И мануал на микросхему 25q64, там описаны команды в которых я пока заплюхался.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение Dimon456 »

franc_di, из мануал на микросхему 25q64 вам нужна всего одна команда Read Data (03h). Там даже и картинка прилагается.
Вам для чего этот чип нужен?
Вы должны знать, что этот чип не умеет переписывать ячейку памяти, он умеет ее только стирать, и то блоками, либо целиком чип.
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

franc_di, из мануал на микросхему 25q64 вам нужна всего одна команда Read Data (03h). Там даже и картинка прилагается.
Вам для чего этот чип нужен?
Вы должны знать, что этот чип не умеет переписывать ячейку памяти, он умеет ее только стирать, и то блоками, либо целиком чип.

Ой спасибо, я не дочитал значит тогда, завис на таблице 1.
Мне этот чип нужен для того чтобы хранить там пару мегабайт данных. Данные буду заливать на программаторе ch341 без всяких проблем. А атмега будет считывать по одному байту из конкретных адресов этого чипа. Такчто стирать он ничего не должен, темболее что является всего лишь микросхем ой памяти.
franc_di
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб фев 08, 2020 02:33:35

Re: Atmega8 и SPI 25 серии помогите разобраться

Сообщение franc_di »

Изображение

Снова я с глупыми вопросами :) .

Вот значит согласно этой картинке и описанию из даташита я пытаюсь понять принцип.
Судя по описанию, запись команды в регистр данных инициирует режим spi . При этом видимо на вводе /cs появляется лог "0".

Суть вопроса: Регистр обмена данных вроде как 8 бит, а судя по картинке нужно подать команду из 8 бит затем адрес ячейки из 24 бит, после чего микросхема памяти отправит обратно в регистр данных 8 бит из ячейки. Получается чтобы прочитать 8 бит данных, нужно отправить 32 бита (суммарно команда и адрес). И как это впихнуть в 8 битный буфер атмеги?

Добавлено after 1 hour 28 minutes 19 seconds:
И как вообще инструкцию 03h можно записать в регистр SPDR. 03h это что вообще такое, в какой системе счисления записано? Как ее в двоичный вариант перегнать.

Добавлено after 25 minutes:
или 03h это 03 в hex, то есть в bin будет 00000011

Добавлено after 42 minutes 55 seconds:
PORTB &= ~_BV(PB2); //установка низкого логического уровня на линии SS

SPDR = 0x00000011; //команда 03h передачи данных инициирует режим spi
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся

SPDR = 0x00000000; //команда 1 байт адреса
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся

SPDR = 0x00000000; //команда 2 байт адреса
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся

SPDR = 0x00000000; //команда 3 байт адреса
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся

a = SPDR; //считывание данных из регистра SPDR в переменную a

PORTB |= _BV(PB2); // установка высокого логического уровня на линии SS


Подскажите, это правильная конструкция?
Ответить

Вернуться в «AVR»