STM32F030 и 24-битный SPI

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Kirra
Встал на лапы
Сообщения: 91
Зарегистрирован: Пн фев 17, 2014 21:39:52
Откуда: Saratov

STM32F030 и 24-битный SPI

Сообщение Kirra »

Всем добра.
Вообщем, есть STM32F030F4P6 который должен отправить по SPI посылку длиной 24 бита.

для этого, я делаю следующее
настраиваю тактирование (использую HSI, т.к. китайский кварц не хочет что-то работать)

Код: Выделить всё

void RCC_Initialization (void)
{
	RCC_DeInit();
	RCC_HSEConfig(RCC_HSE_OFF);
	RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12); /** 8/2 * 12 => 48 MHz */
	RCC_PLLCmd(ENABLE);
	RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
}
потом настраиваю ноги SPI

Код: Выделить всё

void GPIO_Initialization (void)
{
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_DeInit(GPIOA);

	/** Init GPIO as SPI */
	GPIO_StructInit(&GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |
	   GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_0);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);
}
и настраиваю сам SPI

Код: Выделить всё

void SPI_Initialization (void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

	SPI_InitTypeDef SPI_InitStructure;
	SPI_I2S_DeInit(SPI1);

	SPI_StructInit(&SPI_InitStructure);

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	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_2;
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

	SPI_Init(SPI1, &SPI_InitStructure);

	SPI_Cmd(SPI1, ENABLE);

	SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
}
Если всё верно понял, то эта штука поднимает SPI_FRAME в 1

Код: Выделить всё

SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
и потом, всё это дело пытаюсь использовать (например, отправить 0x10ff55)

Код: Выделить всё

int main (void)
{
	RCC_Initialization();
	GPIO_Initialization();
	SPI_Initialization();

	while (true)
	{
		SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Reset); /** сбрасываем Frame в 0, т.к. у меня активный низкий уровень */

		while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); /** ждём, пока освободится передатчик */
		SPI_SendData8(SPI1, 0x10); /** отправляем первые 8 бит */

		while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
		SPI_SendData8(SPI1, 0xff);

		while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
		SPI_SendData8(SPI1, 0x55);

		SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set); /** устанавливаем Frame в 1, все 24 бит данных переданы */
	}

	return 0;
}
но смотрю осциллографом, ничего нет. Все линии в нуле.
В чём может скрываться проблема?
Я волшебник
Реклама
Аватара пользователя
Kirra
Встал на лапы
Сообщения: 91
Зарегистрирован: Пн фев 17, 2014 21:39:52
Откуда: Saratov

Re: STM32F030 и 24-битный SPI

Сообщение Kirra »

Вообщем, проблема решена. Дело было в том, что если хочешь программно менять фрейм, то не надо объявлять ножку SPI_NSS (ножка A4) как альтернативную функцию, её просто как обычный порт.
ну и транзакцию по SPI немного изменил

Код: Выделить всё

	GPIO_ResetBits(GPIOA, GPIO_Pin_4); // Роняем CS в ноль, типа выбрали устройство
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //ждём, пока освободится буфер
	SPI_SendData8(SPI1, 0x55); // шлём ценные данные
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); // ждём, пока все данные не отправятся 
	GPIO_SetBits(GPIOA, GPIO_Pin_4); // CS в единице
SPI вообщем заработал.
Я волшебник
Реклама
Ответить

Вернуться в «ARM»