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

 
 
> STM32F4Discovery SPI, сигнал CS, что-то пошло не так
ilkz
сообщение Sep 9 2015, 10:49
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 135
Регистрация: 9-09-11
Пользователь №: 67 084



Друзья, не могу понять в чем дело.
Завожу SPI в режиме мастера, сигналом CS управляю как отдельным пином.
Ожидаю поведения, когда он (CS) нулем подчеркивает все данные, но он почему-то этого не делает (см картинку).
Самое интересное, что если в начало тела while(1) дописать что-то типа printf("spi send %X\n", 0xC1);, то CS начинает формироваться правильно.

Код привожу ниже.

CODE
void spi2_init(void){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); // sck
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); // mosi
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); // miso

GPIO.GPIO_Mode = GPIO_Mode_AF;
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO.GPIO_OType = GPIO_OType_PP;
GPIO.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOB, &GPIO);

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_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI2, &SPI_InitStructure);
//SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
SPI_Cmd(SPI2, ENABLE);
SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Set);

GPIO.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO.GPIO_Mode = GPIO_Mode_OUT;
GPIO.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init (GPIOB, &GPIO);
}

void spi2_send(uint8_t value) {
SPI_I2S_SendData(SPI2, value);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
}

void ad_send(uint8_t value) {
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
spi2_send(value);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

int main(void) {
SystemInit();
TM_DELAY_Init();
TM_DISCO_LedInit();
spi2_init();
while (1) {
//printf("spi send %X\n", 0xC1);
ad_send(0xC1);
Delayms(1);
}
}


Прикрепленное изображение





UPD:
Опытным путем выяснилось, что если вставить задержку между SPI_I2S_SendData() и ожиданием флага SPI_I2S_FLAG_BSY, то все начинает работать:

Код
void spi2_send(uint8_t value) {
    int i;
    SPI_I2S_SendData(SPI2, value);
    for(i=0; i<63; i++);
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
}


Получается что нельзя проверяь флаг SPI_I2S_FLAG_BSY сразу после отправки? Он что, не успевает встать?

Сообщение отредактировал IgorKossak - Sep 9 2015, 19:36
Причина редактирования: [codeebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ilkz   STM32F4Discovery SPI, сигнал CS   Sep 9 2015, 10:49
- - esaulenka   Какой-то странный флаг у ST-шников получился, да. ...   Sep 9 2015, 11:23
|- - ilkz   Цитата(esaulenka @ Sep 9 2015, 14:23) Как...   Sep 9 2015, 11:28
|- - jcxz   Цитата(ilkz @ Sep 9 2015, 17:28) Как вы в...   Sep 10 2015, 02:56
- - esaulenka   Вопрос крайне интересен :-) Мне всегда был нужен д...   Sep 9 2015, 11:37
- - ilkz   :-) С приемом да - все понятно. Вопрос с только пе...   Sep 9 2015, 11:43
- - Obam   "…как вы управляете сигналом CS, если SPI раб...   Sep 9 2015, 11:53
- - Golikov A.   Можно поилить TXE и BSY, или действительно что про...   Sep 9 2015, 11:57
- - ilkz   Ну ок, логика вида: Кодvoid spi2_send(uint8_t...   Sep 9 2015, 12:06
- - Obam   Удалено. Согласен с rudy_b   Sep 9 2015, 12:24
- - rudy_b   Это стандартная проблема для всей криворукой периф...   Sep 9 2015, 12:25
- - ilkz   rudy_b, проверяем: Кодvoid spi2_send(uint8_t ...   Sep 9 2015, 12:53
- - rudy_b   Рекомендация - из их даташита (stm32F207). Ну, ка...   Sep 9 2015, 13:05
- - Golikov A.   Ну может тогда еще проще Кодvoid spi2_send(uin...   Sep 9 2015, 13:08
- - Obam   SPI в 8 раз медленней ядра (пост #1); на какой час...   Sep 9 2015, 13:37
- - ilkz   Вроде как 168МГц.   Sep 9 2015, 13:47
- - Obam   Запустите ядро ядро мегагерцах на 30-ти. Что будет...   Sep 9 2015, 13:56
- - rudy_b   Делитель (1/8) работает с клоками APB1. А есть еще...   Sep 9 2015, 13:58
- - Obam   Если уж исследовать, то не грех подтянуть частоту ...   Sep 9 2015, 14:09
- - AHTOXA   Цитата(ilkz @ Sep 9 2015, 15:49) Друзья, ...   Sep 10 2015, 04:43
|- - jcxz   Цитата(AHTOXA @ Sep 10 2015, 10:43) Вкрат...   Sep 11 2015, 08:30
- - ilkz   Ладно, с этм разберусь когда железяку запущу хоть ...   Sep 10 2015, 07:58
- - esaulenka   Потому что StdLib - ад и ужас. Клок на шине выста...   Sep 10 2015, 08:57
- - ilkz   Цитата(esaulenka @ Sep 10 2015, 11:57) По...   Sep 11 2015, 06:30
- - Golikov A.   Ну тут надо немного подумать. Как слейв узнает пиш...   Sep 11 2015, 06:40
- - Obam   "А как быть, если нужно прочитать много байт,...   Sep 11 2015, 07:04
- - ilkz   Ну в принципе да, в командах всегда есть флаг R/W.   Sep 11 2015, 07:41
- - Obam   ilkz, попробуете замедлить ядро чтобы SPI успевал ...   Sep 11 2015, 08:10
- - Genadi Zawidowski   Напоминаю, что дождавшись RXNE надо обязательно пр...   Sep 11 2015, 09:02
|- - jcxz   Цитата(Genadi Zawidowski @ Sep 11 2015, 15...   Sep 11 2015, 09:25
- - ilkz   Цитата(Obam @ Sep 11 2015, 11:10) ilkz, п...   Sep 11 2015, 10:06
- - Genadi Zawidowski   Сейчас применяются STM32F4 и STM32F7 уже... В нам...   Sep 11 2015, 10:11
- - ilkz   Цитата(Genadi Zawidowski @ Sep 11 2015, 13...   Sep 11 2015, 11:58
- - Genadi Zawidowski   ЦитатаДумаете всё-таки рискнуть и применить в след...   Sep 11 2015, 19:32


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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 08:14
Рейтинг@Mail.ru


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