реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103.... и SPI3, прошу совета
Valentin-k
сообщение Jan 27 2012, 18:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923



Здравствуйте!столкнулся тут с проблемой
решил подключить к процу STM32F103 флешпамять внешнюю m25p64 на SPI3, т.к. остальные уже задействованы.
но на этом SPI сидит еще и JTAG
я программно сделал ремап, отключив JTAG и оставив только SWD и на всякий случай убрал из жгута эти два проводка.
но SPI все равно не работает...по отладчику все проходит, флаги ставятся и т.п. но ничего не принимает...а когда я посмотрел осциллографом оказалось что физически работает только линия выборки CS которая программно сбрасывается и выставляется, на остальных выводах глухо
хотя использую стандартные функции по интерфейсу...
может кто сталкивался?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 27 2012, 19:00
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А какой именно у вас STM32F103? Там точно есть SPI3? sm.gif
Если есть, то показывайте код инициализации, чудес-то не бывает.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Valentin-k
сообщение Jan 27 2012, 20:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923



вот текст инициализации....проверял несколько раз, да и при пошаговом поспроизведении по регистрам смотрел - вроде все верно
CODE
//функция инициализации SPI

/* Includes ------------------------------------------------------------------*/
#include "spi_flash.h"

/* Private typedef -----------------------------------------------------------*/
#define SPI_FLASH_PageSize 0x100 //размер страницы

/* Private define ------------------------------------------------------------*/
#define FLASH_ID 0x202017

#define WRITE 0x02 // Команда записи в память
#define WRSR 0x01 // Команда записи регистра статуса
#define WREN 0x06 // Команда разрешения на запись

#define READ 0x03 // Команда чтения из памяти
#define RDSR 0x05 // Команда чтения регистра статуса
#define RDID 0x9F // Команда чтения идентификатора
#define SE 0xD8 // Команда очистки сектора
#define BE 0xC7 // Команда полной очистки

#define WIP_Flag 0x01 // Write In Progress (WIP) flag

#define Dummy_Byte 0xA5
#define SPI_port SPI3

__IO uint32_t FlashID_m25p64 = 0;

uint8_t SPI_FLASH_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //выключаем JTAG, SW отстается включенным

GPIO_InitStructure.GPIO_Pin = 3 | 5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 12 | 15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOG, &GPIO_InitStructure);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);

SPI_FLASH_CS_HIGH();// отмена выбора памяти
// RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPInn, DISABLE);
// конфигурация SPI3
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI_port, &SPI_InitStructure);
SPI_Cmd(SPI_port, ENABLE); // загрузка SPI3



FlashID_m25p64 = SPI_FLASH_ReadID(); //считываем идентификатор
if(FlashID_m25p64==FLASH_ID)
{
return 1;//успешная проверка
}
else
{
return 0;//идентификатор не совпал
}
}

остальные функции не стал писать, они базовые

а проц STM32F103VG с 1мб
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Jan 27 2012, 22:18
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



Вот тут может быть причина...
Посмотрите, в каком режиме функционируют выходы GPIOB - "General purpose output push-pull" или "Alternate function output Push-pull" (то, что у Вас задается командами вида "GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP").
Если при записи данных в "Port output data register (GPIOx_ODR)" эти данные появляются на выходных линиях - значит режим "Alternate function output Push-pull" не включен.
А именно этот режим нужен, чтобы использовать SPI, I2C и прочую периферию (для I2C - "Alternate function output Open-drain").
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 28 2012, 05:28
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Valentin-k @ Jan 28 2012, 02:47) *
вот текст инициализации....

Не вижу включения тактирования GPIO и AFIO. Про неправильный режим ножек уже сказали.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Valentin-k
сообщение Jan 28 2012, 08:36
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923



т.е. надо в режиме писать GPIO_Mode_AF_PP? но дело в том что я это пробовал

а тактирование GPIO и AFIO включается в отдельно в начале проги,а тут дело в том что подобным образом сделано общение с АЦП через SPI2 и там работает
Go to the top of the page
 
+Quote Post
Valentin-k
сообщение Jan 30 2012, 06:23
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923



спасибо.оказалось все дело в настройке двух пинов было...просто когда до этого я их в альтернативный режим переводил я не делал ремап jtag,а после не пробовал.
сейчас все заработало
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 30 2012, 07:05
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Valentin-k @ Jan 30 2012, 09:23) *
сейчас все заработало
По чистой случайности, видимо.
Цитата(Valentin-k @ Jan 27 2012, 23:47) *
GPIO_InitStructure.GPIO_Pin = 3 | 5;
GPIO_InitStructure.GPIO_Pin = 4;
GPIO_InitStructure.GPIO_Pin = 12 | 15;
Тут ИМХО маски битовые должны быть (1<<3)|(1<<5), (1<<4) и т.д.
Гляньте как в заголовочных файлах определены GPIO_Pin_12, GPIO_Pin_XX - многое поймёте.
И лучше эти (GPIO_Pin_XX) дефайны и используйте раз уж библиотекой пользуетесь.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Valentin-k
сообщение Jan 30 2012, 07:25
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923



маски я тоже выставил...правда в подробности не вдавался,по примеру смотрел
спасибо.
Go to the top of the page
 
+Quote Post
Jerioma
сообщение May 22 2015, 09:26
Сообщение #10





Группа: Новичок
Сообщений: 1
Регистрация: 22-05-15
Пользователь №: 86 821



Privet, toze nemagu zapustit SPI3 na stm32F103vet6. Kogda meniaju na na SPI1 ili SPI2 to rabotajet. Nasol eto obsuzdenije i obradyvalsia no poproboval dobavit " GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); " vsio takze nerabotajet. mozet ja zacyklilsia i uze nevizu problemy ocividnaj. :S

CODE
void SPI3_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

// Enable SPI3 and GPIOA clocks
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_
GPIOC|RCC_APB2Periph_GPIOD, ENABLE);

//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable | GPIO_Remap_SWJ_NoJTRST, ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

// CS pin
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);


// Configure SPI3 pins: SCK, MISO and MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);


// SPI3 configuration
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
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_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI3, &SPI_InitStructure);

// Enable SPI3
SPI_Cmd(SPI3, ENABLE);
}

unsigned char SPI3_ReadWrite(unsigned char writedat)
{
/* Loop while DR register in not emplty */
while (SPI_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);

/* Send byte through the SPI3 peripheral */
SPI_SendData(SPI3, writedat);

/* Wait to receive a byte */
while (SPI_GetFlagStatus(SPI3, SPI_FLAG_RXNE) == RESET);

/* Return the byte read from the SPI bus */
return SPI_ReceiveData(SPI3);
}


Сообщение отредактировал IgorKossak - May 22 2015, 15:53
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016