С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/45: Рейтинг темы: голосов - 45, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 02.04.2011
Сообщений: 37
1

STM32F4-Discovery. Передача данных

04.06.2013, 14:14. Показов 9164. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Добровольно-принудительно начал изучение STM32F4-Diskavery. Задача стоит следующая с компа нужно записывать в ПЗУ(AT24C64AN) данные и потом их считывать. Как мне сказали чтобы общаться с ПЗУ нужно использовать I2C.
И теперь в голове куча вопросов по реализации как все это сделать.
А именно
1)как связать STM32F4-Diskavery с Компом (в моем случае с С++Builder)?!
После попытки осилить все это самому в голове все уже перемешалось и уже не пойму что да как.
Я думал что есть какая-то библиотека которую нужно подключить и вытащить из нее функции OPEN, send, recive или что-то в этом роде. Но после копания в нэте , как я понял нужно писать прошивку для дискавери чтоб реализовать программу управления на C++Builder-e
2) Реализация I2C на STM32F4-Diskavery?!
Как я вычитал в инете, нужно написать под это дело прошивку, но если и находил описание то очень туманное и лишь одно написано четко - что это не так уж и просто.

Если можно давайте начнем с 1-го вопроса ибо тут вообще пока не движется дело. Со вторым хоть какие-то примеры есть.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2013, 14:14
Ответы с готовыми решениями:

STM32F4 Discovery передача данных с акселерометра в терминал
Добрый день, господа форумчане и форумчанки! Прошу вашей помощи. Имеется отладочная плата STM32F4...

Реализация обмена данных по USB Custom class на STM32F4-Discovery
Доброго времени суток! С недавнего времени у меня оказалась на руках платка STM32F4 Discovery и...

Микрофон STM32F4 Discovery
Здравствуйте, приобрел себе плату STM32F407VGT6. На ней стоит микрофон. Вопрос: Как с него...

USART1 на STM32F4-Discovery
Пытаюсь настроить USORT1 на STM32F4-Dyscovery. Плата подключена к компьютеру через USB-UART...

STM32F4 discovery не отлаживается
купил подключил к coosox. не отлаживается. пишет - No source available for "" fffffffc: ...

9
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 3
04.06.2013, 14:21 2
...начать нужно непосредственно с документации на плату и даташита на EEPROM, в них все расписано.
0
2 / 2 / 0
Регистрация: 02.04.2011
Сообщений: 37
04.06.2013, 14:38  [ТС] 3
Поэтому сюда и написал так как ничего не понял, очень много, про то как сделать прошивки различных интерфейсов типо SPI и тд. для STM32, но как общаться с компом так и не увидел.
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.06.2013, 15:33 4
IIIKBAJL, напрямую "плату" с "Builder'ом"? Вам надо разбить задачу на неск.этапов:
1) Научиться программировать STM32F4 через плату дискавери. Как правило для этого юзается KEIL, IAR или Coocox. Ставите, смотрите примеры, изучаете, пишете свое...
2) Изучить работу STM32F4 c AT24C64AN. Опять же, это есть в примерах от ST (advanced I2C, или как-то так).
3) Изучить возможные интерфейсы обмена между ПК и stm32f4. Это может быть UART или USB (в самых простых случаях).
4) Написать код в Билдере и для STM32F4 под выбранный Вами интерфейс обмена данными.

ЗЫ: задача несложная, но вам начинать надо с азов.
0
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 3
04.06.2013, 15:37 5
we.easyelectronics.ru/STM32/primery-raboty-s-usb-device-dlya-stm32f4-discovey.html
0
2 / 2 / 0
Регистрация: 02.04.2011
Сообщений: 37
05.06.2013, 13:41  [ТС] 6
Используя ваш совет, нашел пример кода по I2C, собрал проект, скомпилировал, залил в плату. Как я понял на выводах PB6 я должен видеть тактовые импульсы и на PB7 данные которые постоянно отправляются по адресам, но на РВ6 - ничего, а на РВ7 - 1-ца .
Как я понял в main-е в цикле постоянная отправка
I2C_write(I2C1, 0x20); // write one byte to the slave
I2C_write(I2C1, 0x03); // write another byte to the slave
но когда я смотрю осциллографом то вижу то что писал выше.
Подскажете что не так?
Вот исходник:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
 #include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_i2c.h"
/*******************************************************************/
#define SLAVE_ADDRESS 0x3D // the slave address (example)
 
GPIO_InitTypeDef GPIO_InitStruct;
    I2C_InitTypeDef I2C_InitStruct;
 
uint8_t sendData[8];
uint8_t bytesToSend = 8;
uint8_t sendDataCounter = 0;
/*******************************************************************/
void init_I2C1(void)
{
    
 
    // enable APB1 peripheral clock for I2C1
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    // enable clock for SCL and SDA pins
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
 
    /* setup SCL and SDA pins
     * You can connect I2C1 to two different
     * pairs of pins:
     * 1. SCL on PB6 and SDA on PB7
     * 2. SCL on PB8 and SDA on PB9
     */
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // we are going to use PB6 and PB7
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;           // set pins to alternate function
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;      // set GPIO speed
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;         // set output to open drain --> the line has to be only pulled low, not driven high
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;           // enable pull up resistors
    GPIO_Init(GPIOB, &GPIO_InitStruct);                 // init GPIOB
 
    // Connect I2C1 pins to AF
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); // SCL
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); // SDA
 
    // configure I2C1
    I2C_InitStruct.I2C_ClockSpeed = 100000;         // 100kHz
    I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;         // I2C mode
    I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; // 50% duty cycle --> standard
    I2C_InitStruct.I2C_OwnAddress1 = 0x00;          // own address, not relevant in master mode
    I2C_InitStruct.I2C_Ack = I2C_Ack_Disable;       // disable acknowledge when reading (can be changed later on)
    I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // set address length to 7 bit addresses
    I2C_Init(I2C1, &I2C_InitStruct);                // init I2C1
 
    // enable I2C1
    I2C_Cmd(I2C1, ENABLE);
}
/*******************************************************************/
/* This function issues a start condition and
 * transmits the slave address + R/W bit
 *
 * Parameters:
 *      I2Cx --> the I2C peripheral e.g. I2C1
 *      address --> the 7 bit slave address
 *      direction --> the tranmission direction can be:
 *                      I2C_Direction_Tranmitter for Master transmitter mode
 *                      I2C_Direction_Receiver for Master receiver
 */
 
void I2C_start(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction)
{
    // wait until I2C1 is not busy anymore
    while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
 
    // Send I2C1 START condition
    I2C_GenerateSTART(I2Cx, ENABLE);
 
    // wait for I2C1 EV5 --> Slave has acknowledged start condition
    while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
 
    // Send slave Address for write
    I2C_Send7bitAddress(I2Cx, address, direction);
 
    /* wait for I2C1 EV6, check if
     * either Slave has acknowledged Master transmitter or
     * Master receiver mode, depending on the transmission
     * direction
     */
    if(direction == I2C_Direction_Transmitter){
        while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    }
    else if(direction == I2C_Direction_Receiver){
        while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    }
}
 
/*******************************************************************/
 
/* This function transmits one byte to the slave device
 * Parameters:
 *      I2Cx --> the I2C peripheral e.g. I2C1
 *      data --> the data byte to be transmitted
 */
 
void I2C_write(I2C_TypeDef* I2Cx, uint8_t data)
{
    I2C_SendData(I2Cx, data);
    // wait for I2C1 EV8_2 --> byte has been transmitted
    while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
 
/*******************************************************************/
/* This function reads one byte from the slave device
 * and acknowledges the byte (requests another byte)
 */
uint8_t I2C_read_ack(I2C_TypeDef* I2Cx)
{
    uint8_t data;
    // enable acknowledge of recieved data
    I2C_AcknowledgeConfig(I2Cx, ENABLE);
    // wait until one byte has been received
    while( !I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED) );
    // read data from I2C data register and return data byte
    data = I2C_ReceiveData(I2Cx);
    return data;
}
/*******************************************************************/
/* This function reads one byte from the slave device
 * and doesn't acknowledge the recieved data
 */
uint8_t I2C_read_nack(I2C_TypeDef* I2Cx)
{
    uint8_t data;
    // disabe acknowledge of received data
    I2C_AcknowledgeConfig(I2Cx, DISABLE);
    // wait until one byte has been received
    while( !I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED) );
    // read data from I2C data register and return data byte
    data = I2C_ReceiveData(I2Cx);
    return data;
}
/*******************************************************************/
/* This funtion issues a stop condition and therefore
 * releases the bus
 */
void I2C_stop(I2C_TypeDef* I2Cx)
{
    // Send I2C1 STOP Condition
    I2C_GenerateSTOP(I2Cx, ENABLE);
}
/*******************************************************************/
 
/*******************************************************************/
int main()
{
    uint8_t received_data[2];
    
    init_I2C1(); // initialize I2C peripheral
 
    while(1)
    {
        I2C_start(I2C1, SLAVE_ADDRESS, I2C_Direction_Transmitter); // start a transmission in Master transmitter mode
        I2C_write(I2C1, 0x20); // write one byte to the slave
        I2C_write(I2C1, 0x03); // write another byte to the slave
        I2C_stop(I2C1); // stop the transmission
 
        //I2C_start(I2C1, SLAVE_ADDRESS, I2C_Direction_Receiver); // start a transmission in Master receiver mode
        //received_data[0] = I2C_read_ack(I2C1); // read one byte and request another byte
        //received_data[1] = I2C_read_nack(I2C1); // read one byte and don't request another byte
        //I2C_stop(I2C1); // stop the transmission
    }
}
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.06.2013, 13:51 7
IIIKBAJL, для I2C нужно два внешних резистора 4,7к на SDA, SDL к плюсу. Иначе шина будет находиться в состоянии BUSY.
1
2 / 2 / 0
Регистрация: 02.04.2011
Сообщений: 37
05.06.2013, 14:51  [ТС] 8
Подключил резисторы - все точно также((. Подключал и к 5ти и к 3м Вольтам
Вот фото подключения
Миниатюры
STM32F4-Discovery. Передача данных  
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
05.06.2013, 15:27 9
IIIKBAJL, вот на 5В это вы поторопились . Потому что на СТМ32 линии i2c часто не поддерживают 5В на своем пине.
И еще - у вас в коде нет инициализации PLL (это расстановки частот, на которых работает разная периферия). Обычно это должно быть на старте, называется типа "RCC_Configuration". Я не знаю что по умолчанию берется, но в общем случае I2C может просто не быть включен. Само по себе включение периферии, это еще не все - ее тактовать нужно.
1
2 / 2 / 0
Регистрация: 02.04.2011
Сообщений: 37
02.08.2013, 10:29  [ТС] 10
После долгих исканий и нервов потраченное на это дело все оказалось правильно с моей стороны(Оказалась что в устройстве стояла битая память). По I2C все пишется и читается... с остальными частями пока все не очень ...
0
02.08.2013, 10:29
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2013, 10:29
Помогаю со студенческими работами здесь

Осциллограф на STM32F4-Discovery
Хотел прикупить недорогой китайский usb осцилл, да вот вспомнил что есть дискавери в запасах....

SDIO на STM32F4 Discovery
Всем привет! Возник такой вопрос! Кто-нибудь пробовал запускать SDIO на STM32F4 DISCOVERY? Меня...

STM32f4-discovery DDS
День добрый. Решил сгенерировать синус, используя ST32F429 (отладочная плада stm32f4-discovery)....

STM32F4-Discovery и CoIDE1.6.0
Делать сейчас пока нечего, достал платку, подключил, написал код. Кокос точно очищивает флеш,...

АЦП STM32F4-Discovery
Раньше с МК дело не имел. Заинтересовало - начал разбираться, взял STM32F4-Dyscovery. И вот как...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru