Перейти к содержанию

Spi+Usart Help Me Plz!


fire_soft

Рекомендуемые сообщения

Добрые просвящённые люди! Помогите с программкой. SPI должна отправлять данные в USART, а он выводить данные в терминал. У USART есть синхронный режим для работы с spi, но я его чёт не понимаю.

Stm32f107vc.

Вот код:

#include "stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_spi.h"

#include "stm32f10x_usart.h"

#include "stm32f10x_dma.h"

/*~~~~~~~~~~~~~~~~~~~ Initialize structure ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

SPI_InitTypeDef SPI_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

USART_ClockInitTypeDef USART_ClockInitStruct;

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Initialize tacting~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

void tact()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);

}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Initialize SPI1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

void setup_spi()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//sck

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//mosi tx

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//miso rx

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

SPI_SSOutputCmd(SPI1,ENABLE);

SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;

SPI_Init(SPI1, &SPI_InitStructure);

SPI_Cmd(SPI1, ENABLE);

}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Initialize USART2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

void setup_uart()

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Tx;

USART_Init(USART2, &USART_InitStructure);

USART_ClockInitStruct.USART_Clock = USART_Clock_Enable;

USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low;

USART_ClockInitStruct.USART_CPHA = USART_CPHA_1Edge;

USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable;

USART_ClockInit(USART2, &USART_ClockInitStruct);

USART_Cmd(USART2, ENABLE);

}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

int main(){

tact();

setup_uart();

setup_spi();

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

while(1){

USART2->Dr = 'O'; // В терминал кстати выводит; Через rs232.

SPI1->Dr='H';

}

}

Изменено пользователем fire_soft
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

А что конкретно нужно то? (из описания непонятно, откуда и куда и чего). Если есть у этого контроллера есть отдельный модуль SPI, а также отдельный модуль USART - то их настройки друг друга не касаются - каждый сам по себе. Единственное что - у USART есть синхронный режим. В синхронном режиме сигналы USART по идее выглядят также, как SPI (или почти также). Т.е. можно синхронно настроенный USART применять для обмена с SPI-устройством. Но встроенного модуля SPI это никак не касается (если он есть). Также стоит отметить, что для обмена с компьютером (или с RS232) USART должен находиться в асинхронном режиме - синхронных режимов RS232 не поддерживает.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

А что конкретно нужно то? (из описания непонятно, откуда и куда и чего). Если есть у этого контроллера есть отдельный модуль SPI, а также отдельный модуль USART - то их настройки друг друга не касаются - каждый сам по себе. Единственное что - у USART есть синхронный режим. В синхронном режиме сигналы USART по идее выглядят также, как SPI (или почти также). Т.е. можно синхронно настроенный USART применять для обмена с SPI-устройством. Но встроенного модуля SPI это никак не касается (если он есть). Также стоит отметить, что для обмена с компьютером (или с RS232) USART должен находиться в асинхронном режиме - синхронных режимов RS232 не поддерживает.

О как . Я ещё новичок в этом поэтому и туплю. Под spi устройством понимается какое-то внешнее устройство? Задача такая: Любим из модулей Spi(1,2,3) отправить данные в Usart(1,2,3) И потом вывести данные в гипер-терминал. Ведь у Spi и Usart есть же какие то свои буферы для данных.

Изменено пользователем fire_soft
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я так понимаю, что у Вас есть некое SPI-устройство внешнее, с него надо считать через модуль SPI, и потом отправить через USART например на комп... Ну это программно можно делать - считал с SPI, записал в UART. Также если у этого МК есть DMA (прямой доступ памяти), то теоретически эту связь можно автоматической сделать без участия программы.

А так я сам по STM32 пока теоретик, но общую суть описал - ищите отдельные примеры - как считывать по SPI, и как записывать в UART (ну и как их настроить). Единственное что остаётся - полученный с SPI байт засунуть на отправку в UART.

Ссылка на комментарий
Поделиться на другие сайты

Я так понимаю, что у Вас есть некое SPI-устройство внешнее, с него надо считать через модуль SPI, и потом отправить через USART например на комп... Ну это программно можно делать - считал с SPI, записал в UART. Также если у этого МК есть DMA (прямой доступ памяти), то теоретически эту связь можно автоматической сделать без участия программы.

А так я сам по STM32 пока теоретик, но общую суть описал - ищите отдельные примеры - как считывать по SPI, и как записывать в UART (ну и как их настроить). Единственное что остаётся - полученный с SPI байт засунуть на отправку в UART.

Так в этом и проблема. Usart не принимает данные, поэтому я всю эту хрень вверху и написал. Возможно что порты не правильно сконфигурированы и нужно правильно делать ремапинг. Раз в синхронном режиме не пашет теперь у меня другие вопросы нужна ли теперь настройка клока для usart чтобы принять данные от spi который без клока не будет работать.

USART_ClockInitStruct.USART_Clock = USART_Clock_Enable;

USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low;

USART_ClockInitStruct.USART_CPHA = USART_CPHA_1Edge;

USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable;

У меня есть отладочная плата mscbstm32c и там находится мк stm32f107vc.

Ссылка на комментарий
Поделиться на другие сайты

Так стоп. Вроде только что надо было отправлять данные по Usart, а не принимать :) Про то, как правильно настроить, понятия не имею, тем более теперь не известно, откуда USART должен ещё и принимать. Почитайте датащит или примеры посмотрите - их навалом.

Ссылка на комментарий
Поделиться на другие сайты

Так стоп. Вроде только что надо было отправлять данные по Usart, а не принимать :) Про то, как правильно настроить, понятия не имею, тем более теперь не известно, откуда USART должен ещё и принимать. Почитайте датащит или примеры посмотрите - их навалом.

:buba: я тупой примеров кучы я видеть!. Так что мне нет разница что я spi на usart что нибудь отправлю нифига не работает, что наоборот буду usartom принимать. А примеры между прочем для разных плат. Уже столько раз сего пробывал задолбался. Вот обмен данных между spi1 и spi2 к примеру master slave у меня ваще на ура получается как usart действует по отношению к spi я не понимаю.

Так стоп. Вроде только что надо было отправлять данные по Usart, а не принимать :) Про то, как правильно настроить, понятия не имею, тем более теперь не известно, откуда USART должен ещё и принимать. Почитайте датащит или примеры посмотрите - их навалом.

То есть откуда принимать?

Ссылка на комментарий
Поделиться на другие сайты

Честно говоря, я могу понять чем примеры из библиотек stm не подходят. Там они наверняка рабочие. Есть именно то, что нужно.

"This example provides a basic communication between USARTy (Synchronous mode)

and SPIy using flags. USARTy and SPIy can be USART1 and SPI1 or USART2 and SPI3,

depending on the STMicroelectronics EVAL board you are using."

Да и посоветовал бы попробовать проверить связку USART-USART. А там, если работает, то искать ошибку в коде. Может и правда где косяк в настройке.

Ссылка на комментарий
Поделиться на другие сайты

Честно говоря, я могу понять чем примеры из библиотек stm не подходят. Там они наверняка рабочие. Есть именно то, что нужно.

"This example provides a basic communication between USARTy (Synchronous mode)

and SPIy using flags. USARTy and SPIy can be USART1 and SPI1 or USART2 and SPI3,

depending on the STMicroelectronics EVAL board you are using."

Да и посоветовал бы попробовать проверить связку USART-USART. А там, если работает, то искать ошибку в коде. Может и правда где косяк в настройке.

И откуда примеры эти брать?

Вот что странно решил запустить Usart3 в даташите написано:

These bits are set and cleared by software. They control the mapping of USART3 CTS,

RTS,CK,TX and RX alternate functions on the GPIO ports.

00: No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14)

01: Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14)

10: not used

11: Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12)

Сделал фулл ремап. Настройки портов и всё как полагается. Usart3->Dr= 'h'; делаю и в терминале ничего нету. То есть не пашет.

Сделал ремап для Usart 2 всё работает, так почему Usart 3 не пашет. В даташите написано for connectivity line devices. Как для моего типа устройств.

Изменено пользователем fire_soft
Ссылка на комментарий
Поделиться на другие сайты

Всё въехал насчёт Usart. Открыл схематику всё понятно стало. Вывести может только Usart2. В терминал. А с spi легче не стало.

Изменено пользователем fire_soft
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Тут я уже писАл, какой ток что на самом деле протекает.  
    • Как к модеру к нему конечно были вопросы. Ну и правила его не касались, когда кидался оскорблениями в адрес Василича. А за ответы на оскорбления Василич баны выхватывал
    • Смотрю, многие в усилителях избегают катодного повторителя. Либо сразу берут токовые лампы с хорошим усилением, либо два каскада последовательно на токовых лампах с низким усилением. Вроде бы на звук не влияет...
    • Имел дело с зарядкой батареек еще с советских времен. Тогда еще в магазине (!) купил специальную зарядку для ртутно-цинковых батареек, очень миниатюрная, зарядка шла от встроенного солнечного элемента (и это еще в советские времена!). Использовал для зарядки батареек для наручных часов, после первой зарядки батарейки хватало примерно на полгода, потом на 3-4 месяца. Потом (когда батарейка служила меньше двух месяцев) батарейка отправлялась на упокой. Спасала студента тогда очень эта вещица. Жалею что тогда не срисовал ее внутренности. А вот с зарядкой щелочных батареек пришлось заниматься уже значительно позже. Мне кто-то подарил такой набор (зарядка с комплектом перезаряжаемых батареек) - вот его обзор https://aphnetworks.com/reviews/pure_energy_xl  Все было нормально, но у всех этих батареек ресурс очень ограничен, примерно 25 циклов максимум. После чего емкость уменьшается и нет смысла их дальше использовать. После каждой зарядки емкость уменьшается, но не сильно. Реально раз десять заряжать можно точно без проблем. После того как выработался ресурс последней батарейки стал вопрос - а можно ли заряжать обычные батарейки тоже? Зарядка-то осталась... И как раз в то время приобрел обычные (т.е. "незаряжаемые") батарейки той же фирмы (PureEnergy). Оказалось что они заряжаются точно также, как и "заряжаемые"! Возможно что у них та же химия... Пробовал батарейки разных фирм, степени разряда. Короче говоря, фирменные всякие Дюраселлы и Энержайзеры не заряжаются вообще, и даже могут потечь во время зарядки. А вот самые дикие и дешевые нонейм чаще всего заряжаются без проблем. Насчет емкости - конечно емкость полностью не восстанавливается, но для работы в беспроводной клаве,, мышке или пульте вполне хватает и достаточно надолго.  Но занимаюсь этим нечасто, просто когда лень ехать в магазин за очередной партией батареек.  А если есть возможность, то предпочитаю переделывать питание под литий. Очень сильно достает саморазряд всяких Ni-Cd, Ni-MH - разряжаются даже те, которые якобы должны долго держать заряд. Схему зарядки еще не срисовывал (лень было разбирать), но схема сложнее чем все что я видел в Интернете. Напряжение заряда примерно 1,7в. xlaa_tds.pdf
    • Я делаю ставку на контакты NC реле запуска и NO реле торможения. Тем более они такие хлипенькие.
    • Раз смогли срисовать схему "силы", то и решить проблему для вас вряд ли сложно будет... Проверьте емкость и ЭПС C-20мкФ и сопротивление контактов этих двух реле в on/off
×
×
  • Создать...