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

shuv

Members
  • Постов

    3
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Красноярск

Электроника

  • Стаж в электронике
    3-5 лет

Достижения shuv

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. shuv

    St32F100 + Mcp3208 По Spi

    внести исправления в мой исходник оказалось невозможно без изменения всей структуры алгоритма. В связи с этим решил обойти недочет "железным" способом. И опять проблема. Решил добавить пин и через него по дополнительной команде развести токи по нужным направлениям. Но задействовать дополнительный вывод оказалось не так просто. Кроме main.c, вносил изменения в mx_init.c Конфиг. выводов в моем случае выглядит так (файл mx_init.c): // Настройка портов на ввод GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init( GPIOB, &GPIO_InitStructure ); // Настройка портов на вывод GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | \ GPIO_Pin_2 | \ GPIO_Pin_3 | \ GPIO_Pin_4 | \ GPIO_Pin_5 | \ GPIO_Pin_6 | \ GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init( GPIOA, &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init( GPIOB, &GPIO_InitStructure ); GPIO_ResetBits( GPIOA,GPIO_Pin_1 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_2 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_3 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_4 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_5 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_6 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_7 ); // Сбросить бит GPIO_ResetBits( GPIOB,GPIO_Pin_0 ); // Сбросить бит GPIO_ResetBits( GPIOB,GPIO_Pin_1 ); Добавляю в инициализацию порт (PA14, на вывод), получается так: // Настройка портов на ввод GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init( GPIOB, &GPIO_InitStructure ); // Настройка портов на вывод GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | \ GPIO_Pin_2 | \ GPIO_Pin_3 | \ GPIO_Pin_4 | \ GPIO_Pin_5 | \ GPIO_Pin_6 | \ GPIO_Pin_14 | \ GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init( GPIOA, &GPIO_InitStructure ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init( GPIOB, &GPIO_InitStructure ); GPIO_ResetBits( GPIOA,GPIO_Pin_1 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_2 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_3 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_4 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_5 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_6 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_7 ); // Сбросить бит GPIO_ResetBits( GPIOA,GPIO_Pin_14 ); // Сбросить бит GPIO_ResetBits( GPIOB,GPIO_Pin_0 ); // Сбросить бит GPIO_ResetBits( GPIOB,GPIO_Pin_1 ); Управляю командой GPIO_SetBits( GPIOA,GPIO_Pin_14 ); - Ноль реакции. В программе так, если активен тот-то режим, то GPIO_SetB... Пробовал с портами А и В. PB постоянно активен ("1" на выходе), PA - на всех выводах "0". Команда из любого места программы, будь-то SetBits или ResetBits никакого влияния на состояние вывода не оказывает (если B, то всегда 1, если А, то 0). В каком месте ещё, кроме файла mx_init.c, может быть обозначен/фиксирован статус портов, их назначение?
  2. shuv

    St32F100 + Mcp3208 По Spi

    Здравствуйте! Прошу помощи в "разборе полетов" с подключением данного АЦП (MCP3208) к ST32F100 по SPI. Есть исходник: (инициализация 3208) // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Прочитать данные с АЦП. 32 цикла для усреднения значений // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void get_adc( uint32_t *adc_sum ) { int i, j, k, m; uint16_t ui16; // Очистить буфер данных АЦП for( j = 0; j < 8; j++ ) { adc_sum[j] = 0; } // прочитать значеня АЦП MCP3208 for( i = 0; i < NN_ADC; i++ ) { for( j = 0; j < 8; j++ ) { k = j << 3; spi_tx_data[0] = 0xC0 | k; // select channel send_spi( 3 ); // 3??????????? ui16 = (uint16_t) ( spi_rx_data[1] << 8 ) | spi_rx_data[2]; // Get 12 bits value ui16 >>= 4; // 2850 if( j < 3 ) { m = abs( 2850 - ui16 ); //m = ui16; adc_sum[j] += m; } else { adc_sum[j] += ui16; // add value to summ } } // for( j = 0; j < 8; j++ ) } // for( i = 0; i < NN_ADC; i++ ) for( j = 0; j < 8; j++ ) { adc_sum[j] /= NN_ADC; } } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Смогли разобрать пока вот столько: void get_adc( uint32_t *adc_sum ) { int i, j, k, m; uint16_t ui16; // Очистить буфер данных АЦП for( j = 0; j < 8; j++ ) { adc_sum[j] = 0; } // прочитать значеня АЦП MCP3208 for( i = 0; i < NN_ADC; i++ ) и застряли на значении NN_ADC. Что оно значит? куда копать? в библиотеках не найдено. Что к чему нифига непонятно.. К контроллерам имею посредственное отношение, только знакомлюсь и, возможно, так и буду "только знаком". Просто исполнитель заказа бросил дело на 90% (для него дело такого масштаба - "наколенные" поделки на энтузиазме). Вопрос теперь больше принципиальный и, несмотря на небольшой размер задачи, хочется клиенту всё же помочь и отдать ему его горе устройства. Прошу помощи хотя бы с этой строчкой.
×
×
  • Создать...