Пт май 19, 2017 20:18:49
Сб май 20, 2017 07:41:08
LL_RCC_HSE_Enable();
/* Wait till HSE is ready */
while(LL_RCC_HSE_IsReady() != 1)
{
}
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
Пн май 22, 2017 12:34:49
#ifndef MAIN_H
#define MAIN_H
#define LCD_RST1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3,GPIO_PIN_SET);
#define LCD_RST0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3,GPIO_PIN_RESET);
// LCD_DC
#define LCD_DC1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);
#define LCD_DC0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_RESET);
// LCD_CS
#define LCD_CS1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_SET);
#define LCD_CS0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,GPIO_PIN_RESET);
void lcd7735_senddata(unsigned char data);
void lcd7735_send16bData(unsigned char msb,unsigned char lsb);
void spi2_8b_init(void);
void spi2_16b_init(void);
#endif
#ifndef MAIN_H
#define MAIN_H
#define LCD_RST1 GPIOA->BSRR=GPIO_BSRR_BS3;
#define LCD_RST0 GPIOA->BSRR=GPIO_BSRR_BR3;
// LCD_DC
#define LCD_DC1 GPIOA->BSRR=GPIO_BSRR_BS4;
#define LCD_DC0 GPIOA->BSRR=GPIO_BSRR_BR4;
// LCD_CS
#define LCD_CS1 GPIOA->BSRR=GPIO_BSRR_BS6;
#define LCD_CS0 GPIOA->BSRR=GPIO_BSRR_BR6;
void lcd7735_senddata(unsigned char data);
void lcd7735_send16bData(unsigned char msb,unsigned char lsb);
void spi2_8b_init(void);
void spi2_16b_init(void);
#endif
Вт май 23, 2017 01:29:34
Data bytes on both MOSI and MISO lines are sent with the MSB first. Data on both MOSI
and MISO lines must be stable on the rising edge of the clock and can be changed on the
falling edge. Data is provided by the MFRC522 on the falling clock edge and is stable
during the rising clock edge.
Ср май 24, 2017 00:51:12
Чт июн 01, 2017 02:07:01
SPI2->CR1 |= SPI_CR1_BR; //Baud rate = Fpclk/256
SPI2->CR2 |= SPI_CR2_RXNEIE; // RX buffer Not Empty Interrupt Enable;
SPI2->CR1 &= ~SPI_CR1_CPOL; //Полярность тактового сигнала
SPI2->CR1 &= ~SPI_CR1_CPHA; //Фаза тактового сигнала
SPI2->CR2 |= SPI_CR2_DS_0 | SPI_CR2_DS_1 | SPI_CR2_DS_2; //8 бит данных
SPI2->CR1 &= ~SPI_CR1_LSBFIRST; //MSB передается первым
SPI2->CR1 |= SPI_CR1_SSM; //Программный режим NSS
SPI2->CR1 |= SPI_CR1_SSI; //Аналогично состоянию, когда на входе NSS высокий уровень
SPI2->CR1 |= SPI_CR1_MSTR; //Режим Master
SPI2->CR1 |= SPI_CR1_SPE; //Включаем SPI2
void SPI2_send_byte (uint8_t Byte)
{
while(!(SPI2->SR & SPI_SR_TXE));
SPI2_NSS_LOW;
SPI2->DR = Byte; //Пишем в буфер передатчика SPI2. После этого стартует обмен данными
}
void SPI2_IRQHandler (void)
{
if (SPI2->SR & SPI_SR_RXNE)
{
SPI2->SR &= ~SPI_SR_RXNE;
SPI2_Got_Byte = (SPI2->DR >> 8);
SPI2_NSS_HIGHT;
}
}
Пт июн 02, 2017 01:41:15
При освоении STM32F0XX новички часто испытывают трудности запуска SPI в режиме 8бит и ниже. Причиной этому является значительное расширение возможностей модуля SPI, по сравнению с предшественниками, и некоторые изменения в работе модуля.
Что делать:
1. По умолчанию доступ к SPIx->DR 16бит. Чтобы получить доступ к SPIx->DR как к регистру 8бит пишем:
Код:
#define SPI1_DR_8bit (*(__IO uint8_t *)((uint32_t)&(SPI1->DR)))
#define SPI2_DR_8bit (*(__IO uint8_t *)((uint32_t)&(SPI2->DR)))
Теперь обращаемся к регистру данных так:
Код:
SPI1_DR_8bit = 0x34;
SPI2_DR_8bit = 0x78;
2. По умолчанию и при запрещённых установках DS [3:0]: Data size регистра SPIx_CR2 устанавливается длина данных 16бит (1111: 16-bit). Поэтому при настройке длины данных логичнее сбрасывать, а не устанавливать определённые биты. Иначе при любой попытке записи некорректного значения, регистр SPIx_CR2 автоматически восстановит длину данных 16бит.
Т.е. для того чтобы установить длину 8бит нужно просто сбросить старший бит DS [3:0] регистра SPIx_CR2.
3. Также встречались жалобы на непонятное поведение бита RXNE. Всё дело в бите FRXTH регистра SPIx_CR2, при работе с данными 8бит требуется его установить .
uint8_t SPI2_send_byte(uint8_t data)
{
while (!(SPI2->SR & SPI_SR_TXE));
(*(__IO uint8_t *)((uint32_t)&(SPI2->DR))) = data;
while (!(SPI2->SR & SPI_SR_RXNE));
return (*(__IO uint8_t *)((uint32_t)&(SPI2->DR)));
}
void SPI2_write_reg(uint8_t address, uint8_t value)
{
SPI2_NSS_LOW;
SPI2_send_byte(address);
SPI2_send_byte(value);
SPI2_NSS_HIGHT;
}
....................................................................................
void RC522_write_register(uint8_t addr, uint8_t val)
{
addr = (addr << 1) & 0x7E;
SPI2_write_reg(addr, val);
}
uint8_t RC522_read_register(uint8_t addr)
{
uint8_t val;
addr = ((addr << 1) & 0x7E) | 0x80;
val = SPI2_read_reg(addr);
return val;
}
#define SPI2_NSS_HIGHT GPIOB->BSRR = GPIO_BSRR_BS_12
#define SPI2_NSS_LOW GPIOB->BSRR = GPIO_BSRR_BR_12
SPI2_write_reg(0x02, 0x0F); // RESET
RC522_write_register(0x2A, 0x8D);
RC522_write_register(0x2B, 0x3E);
RC522_write_register(0x2D, 30);
RC522_write_register(0x2C, 0);
RC522_write_register(0x26, 0x70);
RC522_write_register(0x15, 0x40);
RC522_write_register(0x11, 0x3D);
SPI2_write_reg(0x02, 0x0F); // RESET
while (Tempi < 100000)
{Tempi++;}
Tempi = 0;
RC522_write_register(0x2A, 0x8D);
while (Tempi < 2)
{Tempi++;}
Tempi = 0;
RC522_write_register(0x2B, 0x3E);
while (Tempi < 2)
{Tempi++;}
Tempi = 0;
RC522_write_register(0x2D, 30);
........................................................
Пт июн 02, 2017 10:35:17
#define SPI2_NSS_HIGHT GPIOB->BSRR = GPIO_BSRR_BS_12; asm("nop");asm("nop");asm("nop");
Пт июн 02, 2017 11:26:51
Пт июн 02, 2017 12:32:38
Может есть какие флаги или хитрости?
Пт июн 02, 2017 17:53:57
pokk писал(а):Посмотрите какая вам нужна задержка, если хватает пару тактов,
то их можно внутри дефайна спрятать.
Myp3ik писал(а):Для начала, есть флаги:
dosikus писал(а):почитай мои посты начиная отсюда
Сб июн 03, 2017 16:01:57
Сб июн 03, 2017 22:01:50
Пн июн 05, 2017 03:00:08
Пн июн 05, 2017 20:39:46
Вт июн 06, 2017 00:36:16
Вт июн 06, 2017 00:45:58
void SystemClock_Config (void)
{
RCC->CR|=RCC_CR_HSEON; // Enable HSE.
while (!(RCC->CR & RCC_CR_HSERDY)); // wait HSE.
RCC->CFGR |= RCC_CFGR_PPRE1_2; //APB1 - 36MHz Max
RCC->CFGR |= RCC_CFGR_PLLSRC; //HSE(8MHz) <- PLL
RCC->CFGR &= ~RCC_CFGR_PLLXTPRE; //HSE(8MHz) clock not divided
RCC->CFGR |= RCC_CFGR_PLLMULL9; //PLL multiplication
RCC->CR |= RCC_CR_PLLON;
while(!(RCC->CR&RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_SW_PLL; // <---- перенес сюда
FLASH->ACR |= FLASH_ACR_PRFTBE; // Enable Prefetch Buffer
FLASH->ACR &= ~FLASH_ACR_LATENCY; // Clear
//FLASH->ACR |= FLASH_ACR_LATENCY_0; //SystemCoreClock <= 24 MHz
//FLASH->ACR |= FLASH_ACR_LATENCY_1; //24< SystemCoreClock <= 48 MHz
FLASH->ACR |= FLASH_ACR_LATENCY_2; //48< SystemCoreClock <= 72 MHz
// <---- был здесь
}
Вт июн 06, 2017 01:34:11
RCC->CFGR |= RCC_CFGR_SW_PLL;
//Тактируем ядро
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CR &= ~RCC_CR_PLLON; //Отключаем генератор PLL
RCC->CR &= ~RCC_CR_HSEON;
while((RCC->CR & RCC_CR_HSERDY)!=0) {}
RCC->CR |= RCC_CR_HSION; //Включить генератор HSI
while((RCC->CR & RCC_CR_HSIRDY)==0) {}
RCC->CFGR |= RCC_CFGR_SW_HSI; //Выбрать источником тактового сигнала HSI
//FLASH->ACR |= FLASH_ACR_HLFCYA;
FLASH->ACR |= FLASH_ACR_LATENCY_1; // Пропускаем по два такта (работаем с каждым третьим)
FLASH->ACR |= FLASH_ACR_PRFTBE; // включаем упреждающее чтение
while((FLASH->ACR & FLASH_ACR_PRFTBS)==0) {} // ожидаем установки бита
RCC->CFGR |= RCC_CFGR_ADCPRE_1; // ADC Clock devide by 6 (MAX 14 MHz, clock from AHB2 bus)
RCC->CFGR &= ~RCC_CFGR_PLLSRC; //Источник сигнала для PLL - HSE (внешний генератор)
RCC->CR &= ~RCC_CR_PLLON; //Отключаем генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMULL; //Очищаем биты предделителя
RCC->CFGR |= RCC_CFGR_PLLMULL_0 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_2; //Коефициент умножения 9 (при кварце на 8 МГц будет 72 МГЦ)
RCC->CFGR |= RCC_CFGR_PPRE1_2; // Претделитель низкоскоростной шины APB1 на 2
RCC->CR |= RCC_CR_PLLON; //Включаем PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ждем готовность PLL
//Переключаемся на тактирование от PLL
RCC->CFGR |= RCC_CFGR_SW_1 ; //Источник тактового сигнала - PLL
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} //Ждем переключения на PLL
Вт июн 06, 2017 02:41:39