×

Внимание

Форум находится в режиме только для чтения.

STM32F4 с MAX7221 не доходят команды по SPI

12 года 5 мес. назад #3005 от Mikk
робую посылать команды с STM32F4Discovery на MAX7221. Команды 0x0f01 (включить тестовый режим) и 0x0f00 (отключить тестовый режим). Когда посылаю циклически по несколько раз одну и ту же команду MAX7221 реагирует на них. Когда по одному разу команды часто не доходят. Подскажите в чем может быть проблема

Код:
/* Includes */
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_spi.h"

/* Private macro */
/* Private variables */
/* Private function prototypes */
/* Private functions */
void Init_SPI2(void);
void Out_Data_SPI(uint16_t SPI_Data);
void Delay(__IO uint32_t nCount);

/**
**===========================================================================
**
**  Abstract: main program
**
**===========================================================================
*/
int main(void)
{

Init_SPI2();

   int i = 0;
   Delay(50);
   Out_Data_SPI(0x0f01);

  /* Infinite loop */
  while (1)
  {
   i++;

  }
}

void Init_SPI2(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);
// GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);

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

SPI_I2S_DeInit(SPI2);
/* SPI2 Configuration ----------------------------------------------------*/
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
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_64;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE);
SPI_Cmd(SPI2, ENABLE);

}
void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}
void Out_Data_SPI(uint16_t SPI_Data)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 
SPI_I2S_SendData(SPI2, SPI_Data);
}
12 года 5 мес. назад #3019 от Rustam
А вход CS "дёргаете"?
12 года 5 мес. назад #3022 от Mikk
я уже разобрался с этим вопросом, проблема была именно в CS.
все работает.
теперь код выглядит так:
/* Includes */
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_spi.h"

/* Private macro */
/* Private variables */
/* Private function prototypes */
/* Private functions */
void MAX7221_SPI2_Out (uint8_t segm, uint8_t data);
void MAX7221_Init(void);
void Init_SPI2(void);
void Out_Data_SPI2(uint16_t SPI_Data);
void Delay(__IO uint32_t nCount);

/**
**===========================================================================
**
**  Abstract: main program
**
**===========================================================================
*/
int main(void)
{

Init_SPI2();

MAX7221_Init();


int i = 0;
   Delay(150);

   MAX7221_SPI2_Out(0x01,0xAB);
   MAX7221_SPI2_Out(0x02,0xAB);
   MAX7221_SPI2_Out(0x03,0xAB);
   MAX7221_SPI2_Out(0x04,0xAB);
   MAX7221_SPI2_Out(0x05,0xAB);

  /* Infinite loop */
  while (1)
  {
   i++;
  }
}
void MAX7221_SPI2_Out(uint8_t segm, uint8_t data)
{
	uint16_t MAX7221Out = (uint16_t)(((uint16_t)segm << 8) | data);
	Out_Data_SPI2(MAX7221Out);
}

void MAX7221_Init(void)
{
	   Out_Data_SPI2(0x0f01); // test mode ON
	   Delay(9999999);
	   Out_Data_SPI2(0x0f00); // test mode OFF
	   Out_Data_SPI2(0x0C01); // shutdown mode ON
	   Out_Data_SPI2(0x0B04); // scan limit
	   Out_Data_SPI2(0x0900); // decode mode
	   Out_Data_SPI2(0x0A00); // intensity

	   MAX7221_SPI2_Out(0x01,0x00);
	   MAX7221_SPI2_Out(0x02,0x00);
	   MAX7221_SPI2_Out(0x03,0x00);
	   MAX7221_SPI2_Out(0x04,0x00);
	   MAX7221_SPI2_Out(0x05,0x00);
}

void Init_SPI2(void)
{
	SPI_InitTypeDef SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

	GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_SPI2);
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_9 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	SPI_I2S_DeInit(SPI2);
	/* SPI2 Configuration ----------------------------------------------------*/
	SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
	SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_Init(SPI2, &SPI_InitStructure);

	SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE);
	SPI_SSOutputCmd(SPI2,ENABLE);
}

void Delay(__IO uint32_t nCount)
{
	for(; nCount != 0; nCount--);
}

void Out_Data_SPI2(uint16_t SPI_Data)
{
	SPI_SSOutputCmd(SPI2,DISABLE);
	SPI_Cmd(SPI2, ENABLE);
	SPI_I2S_SendData(SPI2, SPI_Data);
	SPI_SSOutputCmd(SPI2,ENABLE);
	SPI_Cmd(SPI2, DISABLE);
	Delay(70);
}

Подскажите как можно еще  оптимизировать код
12 года 5 мес. назад #3027 от newseltek
У меня со SPI2  на 103-м тоже сплошные проблемы-уже мозги выкипели ,а SPI1 работает хорошо.
Попробуй на SPI1.
Время создания страницы: 0.035 секунд
Работает на Kunena форум