Страница 1 из 5

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

Добавлено: Сб фев 08, 2020 03:12:39
franc_di
Здравствуйте коты :))!

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

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

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

Процессор планирую тактировать от кварца. Естественно ставить внешний тактовой генератор CLk импульсов на отдельной микросхеме совсем не хочется, да и при наличии кварца на проце как-то глупо. А тактовые импульсы нужны и микросхеме памяти и процессору. Объясните мне в чем я запутался.

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

Добавлено: Сб фев 08, 2020 07:42:58
Ivanoff-iv
почитай режимы мастер/слейв spi там тот кто мастер - тот генерирует такт, кто слейв - ловит (понятно, что мега будет мастером)

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

Добавлено: Сб фев 08, 2020 08:50:24
uk8amk
Соединение для SPI памяти:
MOSI -> DI
MISO <- DO
SCK -> CLK
CS -> CS

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

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

Добавлено: Сб фев 08, 2020 10:16:02
franc_di
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3787131#p3787131"]почитай режимы мастер/слейв spi там тот кто мастер - тот генерирует такт, кто слейв - ловит (понятно, что мега будет мастером)[/uquote]

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

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

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

Добавлено after 26 minutes 20 seconds:
[uquote="uk8amk",url="/forum/viewtopic.php?p=3787147#p3787147"]Соединение для SPI памяти:
MOSI -> DI
MISO <- DO
SCK -> CLK
CS -> CS

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

То есть С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 серии помогите разобраться

Добавлено: Сб фев 08, 2020 10:40:21
Самсусамыч
[uquote="franc_di",url="/forum/viewtopic.php?p=3787176#p3787176"]Получается что когда этот бит настроен как мастер, то он будет сам такты выдавать?.[/uquote]
Да.
Мне просто понять хочется, если я конфигурирую порт В под spi интерфейс, то при правильной разводке схемы процессор сам разберется как ему данными обмениваться? или я не правильно понимаю))

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

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

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

Добавлено: Сб фев 08, 2020 11:52:00
franc_di
Вот описание на русском ATmega8_rus https://yadi.sk/i/eovPhxdEf5yRc со стр. 124 описание SPI


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

Теперь буду пробовать рисовать схему и сделаю наброски кода, то как я вижу весь процесс.
Надеюсь чуть позже покажу результаты. Если что ткнете меня в ошибки :)))

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

Добавлено: Сб фев 08, 2020 12:13:55
Demiurg
Выводы микроконтроллера:
MOSI - Master Out Slave In, у МК выход.
MISO - Master In Slave Out, у МК вход.
CLK - Выход тактовых импульсов SPI МК.
_CS - это вход МК в режиме Slave. При этом, если пин настроен как вход, при низком уровне сигнала МК автоматически встает в режим Slave. Решение - настройка пина как выход. То есть запись 1 в DDRx. В этом случае вывод CS используется для управления подчиненного устройства.
Более подробно описано в описании по приведенной выше ссылке.

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

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

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

Добавлено: Вс фев 09, 2020 23:29:29
franc_di
[uquote="NStorm",url="/forum/viewtopic.php?p=3788207#p3788207"]Соединять элементарно - напрямую и всё, как написали.
Если вы на МК используете его SPI, т.е. аппаратную периферию - то конечно влиять не нужно. Разве что CS вручную "дернуть". Хотя вы его вообще можете не использовать, если у одна микросхема памяти будет на линии. Вы можете просто подтянуть его к нулю со стороны памяти.
Внешний кварц вам даже не нужен. Вполне можно использовать внутренний RC на 8 МГц атмеги8.[/uquote]

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

Добавлено after 6 minutes 59 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3787286#p3787286"]Выводы микроконтроллера:
MOSI - Master Out Slave In, у МК выход.
MISO - Master In Slave Out, у МК вход.
CLK - Выход тактовых импульсов SPI МК.
_CS - это вход МК в режиме Slave. При этом, если пин настроен как вход, при низком уровне сигнала МК автоматически встает в режим Slave. Решение - настройка пина как выход. То есть запись 1 в DDRx. В этом случае вывод CS используется для управления подчиненного устройства.
Более подробно описано в описании по приведенной выше ссылке.[/uquote]

Режим слейв меня вообще пока не интересует, это усложняет и без того сложную для меня задачу. В дальнейшем я возможно перейду на sd карточку. Но пока думаю для понимая процесса обмена данными необходимо изучить spi.
Задача контроллера будет заключаться в чтении заранее известных адресов, затем обработка бит данных, занесение в переменные и вывод результата вычисления на другой порт в виде последовательности сигналов.
А дамп я буду пока записывать на программаторе ch341

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

Добавлено: Пн фев 10, 2020 07:15:41
NStorm
Надо будет только согласовать уровни сигналов. А то мои микросхемы получаются с разным питанием.

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

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

Добавлено: Пн фев 10, 2020 08:28:11
Demiurg
[uquote="NStorm",url="/forum/viewtopic.php?p=3788298#p3788298"]
Надо будет только согласовать уровни сигналов. А то мои микросхемы получаются с разным питанием.

Если взять atmega8l/atmega8a, их можно запитать и на 3.3В и не надо будет ничего согласовывать.[/uquote]
Нужно смотреть в даташитах, толерантны ли входы периферии к 5 вольтам. Хорошо, если показывают внутреннюю схему входов. Если на входах стоят диоды, однозначно потребуется согласование входов.

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

Добавлено: Пн фев 10, 2020 09:57:11
NStorm
Demiurg, если напруги питания у МК и слэйва одинаковые будут, то ничего не надо согласовывать. Я об этом писал. У 25q64 напруги афаир 2.7-3.6В, т.е. обычные 3.3В в среднем можно взять. Можно взять атмега8 с буквой L или A - у них 3.3В допустимое питание. Поэтому не надо будет согласовывать, 5В нигде не будет.

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

Добавлено: Пн фев 10, 2020 10:02:43
franc_di
Скорее всего будет проц, которых у меня лежит с Китая 10 штук. А это atmega8-16au. Согласование уровней это не проблема. Проблема код и время на этот код. Разобраться хочу сам, поэтому даже не поднимаю такой вопрос чтобы кто-то писал за меня.

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

Добавлено: Ср фев 12, 2020 11:05:06
Jack_A
[uquote="NStorm",url="/forum/viewtopic.php?p=3788207#p3788207"]Вы можете просто подтянуть его к нулю со стороны памяти.[/uquote]
Крайне не советую. Можно иметь крупный нежданчик. Сам обжёгся когда-то.

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

Добавлено: Ср фев 12, 2020 12:51:51
franc_di
[uquote="Jack_A",url="/forum/viewtopic.php?p=3789588#p3789588"][uquote="NStorm",url="/forum/viewtopic.php?p=3788207#p3788207"]Вы можете просто подтянуть его к нулю со стороны памяти.[/uquote]
Крайне не советую. Можно иметь крупный нежданчик. Сам обжёгся когда-то.[/uquote]

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

Добавлено after 3 minutes 15 seconds:
А на текущий момент я столкнулся с тем что оказывается нужно отправить команду на чтение одного байта + адрес + принять это все в переменную. Не могу по мануалу разобраться как именно записать команду в регистр данных, а главное какую команду.

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

Добавлено: Ср фев 12, 2020 13:13:05
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

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

Добавлено: Ср фев 12, 2020 13:26:29
franc_di
[uquote="akl",url="/forum/viewtopic.php?p=3789658#p3789658"]Что у Вас за мануал? В 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
[/uquote]

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

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

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

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

Добавлено: Ср фев 12, 2020 15:06:48
franc_di
[uquote="Dimon456",url="/forum/viewtopic.php?p=3789709#p3789709"]franc_di, из мануал на микросхему 25q64 вам нужна всего одна команда Read Data (03h). Там даже и картинка прилагается.
Вам для чего этот чип нужен?
Вы должны знать, что этот чип не умеет переписывать ячейку памяти, он умеет ее только стирать, и то блоками, либо целиком чип.[/uquote]
Ой спасибо, я не дочитал значит тогда, завис на таблице 1.
Мне этот чип нужен для того чтобы хранить там пару мегабайт данных. Данные буду заливать на программаторе ch341 без всяких проблем. А атмега будет считывать по одному байту из конкретных адресов этого чипа. Такчто стирать он ничего не должен, темболее что является всего лишь микросхем ой памяти.

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

Добавлено: Пт фев 14, 2020 01:03:46
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


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