Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
215 / 0 / 2
Регистрация: 26.02.2020
Сообщений: 200
1

Передача данных между МК по SPI

14.10.2020, 17:59. Просмотров 408. Ответов 8
Метки нет (Все метки)

Добрый день, поставил задачу передавать число от мастера к слейву, слейв прибавляет 1 к этому числу и возвращает мастеру, мастер это число передает опять слейву, к которому подключен экран. Т.е. я хочу увидеть на экране 0 1 2 3 4 5 6.... а получаю 255 140 0 141 1 142 2 143 3 144 4, т.е я получаю свое инкрементированное число но между ними какой-то мусор , вот код мастера

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "main.h"
int i=0;
int a;
int func (void)
{
    SPDR = i;
    while (!(SPSR&(1<<SPIF)));
    PORTB |= (1<<PORTB2);
    PORTB &= ~(1<<PORTB2);
    _delay_ms(1000);
    return SPDR;
}
int main(void)
{
    DDRB |= ((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5)); // Ножки SPI на выход
    PORTB &= ~((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5)); //низкий уровень
    SPCR = ((1<<SPE)|(1<<MSTR)); //Включим шину, объявим ведущим
    while(1)
    {
        a = func();
        i=a;
    }
}
а вот слейва
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "main.h"
//----------------------------------------
char str[10];
//----------------------------------------
void port_ini(void)
{
    PORTD=0x00;
    DDRD=0xFF;
}
//----------------------------------------
void SPI_init_SL(void)
{
    DDRB |= (1<<PORTB4);//ножки SPI на выход
    DDRB &= ~((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5));//ножки SPI на вход
    SPCR = ((1<<SPE)|(1<<SPIE));//включим шину, включим прерывания
}
//----------------------------------------
ISR(SPI_STC_vect)//прерывание SPI прием байта
{
    unsigned char n;
    n = SPDR;
    clearlcd();//очистим дисплей
    setpos(0,0);
    itoa(n,str,10);
    str_lcd(str);
    _delay_ms(50);
    SPDR = n+1;
    _delay_ms(50);
}
//----------------------------------------
int main(void)
{
    port_ini(); //»нициализируем порты
    LCD_ini();  //»нициализируем дисплей
    SPI_init_SL();//инициализируем SPI
    sei();
    clearlcd();//очистим дисплей
    setpos(0,0);
    str_lcd("Hello World!");
    setpos(2,1);
    str_lcd("String 2");
    setpos(4,2);
    str_lcd("String 3");
    setpos(6,3);
    str_lcd("String 4");
    while(1)
    {
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2020, 17:59
Ответы с готовыми решениями:

Передача данных по SPI, между АЦП и микроконтроллером
Добрый день. Понемногу разбираясь с микроконтроллерами, решил связать МК с АЦП посредством SPI....

Передача данных по SPI на расстояние
Здравствуйте. Почти уже доделал проект, где 2 МК (ATm16 и 8) общаются друг с другом по SPI, убив...

передача и приём данных по SPI на STM32
Здравствуйте, уважаемые форумчане. Пытаюсь наладить общение STM32f723IE, что на плате DISCOVERY и...

Передача данных, вопросы по SPI и SSI интерфейсам
Привет всем. Я работаю над собственным электроприводом, обзавелся силовым драйвером для шагового...

8
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 6
14.10.2020, 18:33 2
в мастере 9 строчку поставить перед 6.
0
215 / 0 / 2
Регистрация: 26.02.2020
Сообщений: 200
15.10.2020, 11:35  [ТС] 3
Цитата Сообщение от emax Посмотреть сообщение
в мастере 9 строчку поставить перед 6.
Пробовал, вообще не работает. И самое интересное, когда я у слейва пишу SPDR=n, чтобы он просто вернул принятое значение, получается 0 128 0 128 0 128 0 128. Откуда берется эта 128 я вообще не понимаю.
0
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 6
15.10.2020, 11:55 4
прерывание происходит при падении SS и при приеме байта, поэтому два прерывания на байт.
0
215 / 0 / 2
Регистрация: 26.02.2020
Сообщений: 200
15.10.2020, 12:12  [ТС] 5
Ну в исходном коде, мастер передает число слейву , а слейв возвращает это значение мастеру у которого есть свой дисплей, выходящий число отправленное и полученное назад от слейва. И все это происходит за один цикл. Да и сам я пробовал передать число 200 и за один цикл я его получал у слейва. В чем же тогда прикол?
0
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 6
16.10.2020, 06:59 6
приходит спад SS - происходит прерывание, данных в SPDR еще нет, этот мусор выводится на дисплей.
Далее приходят данные флаг прерываний взводится. Как только выходим из прерывания, взведенный флаг опять загоняет в прерывание и теперь уже выводит на дисплей правильные данные. Цикл закончен.
0
108 / 80 / 15
Регистрация: 15.11.2012
Сообщений: 543
18.10.2020, 00:10 7
Попробуйте вместо
Цитата Сообщение от mixa88 Посмотреть сообщение
unsigned char n;
    n = SPDR;
сделать
C
1
n = *(uint8_t *)(0x40013000 + 0x0C);
ну и обратно тоже:
C
1
*(uint8_t *)(0x40013000 + 0x0C) = n + 1;
Вместо 0x40013000 поставить базовый адрес используемого SPI.
0
215 / 0 / 2
Регистрация: 26.02.2020
Сообщений: 200
18.10.2020, 22:27  [ТС] 8
А что за адрес? Или адрес регистра SPDR? И для чего +0 x0C?
0
108 / 80 / 15
Регистрация: 15.11.2012
Сообщений: 543
19.10.2020, 00:14 9
В Reference Manual в разделе Memory map таблица с диапазонами адресов различных периферийных устройств.
0x40013000 в данном случае - начальный адрес SPI1. Для других SPI адрес другой.
А + 0x0C - смещение регистра SPI_DR в диапазоне адресов SPI. Это уже в описании регистров самого SPI есть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2020, 00:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Передача ссылки в конструктор (передача данных между формами)
Из темы &quot;Ответы на 7 самых частых вопроса по WinForms&quot; Реализовал метод № 2.3 без проблем, а вот...

Передача данных между Окнами, между VM, Шина Сообщений, Локатор [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Использование...

Передача данных между базами данных в пределах одного экземлпяра
Доброго времени суток! ПОДСКАЖИТЕ,пожалуйста, с помощью чего передавать данные из одной БД в...

Передача данных между Activity
Доброго времени суток, господа. Такой вопрос: с точки зрения ООП програмирования и...

Передача данных между формами
Здравствуйте товарищи программисты. Несколько дней уже бьюсь об компилятор и об msdn, но никак не...

Передача данных между потоками
Всем доброго времени суток. В общем есть приложение, которое парсит сайт с музыкой, добавляет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.