Sergey
3 years ago
16 changed files with 12492 additions and 233 deletions
@ -0,0 +1,99 @@ |
|||||
|
/**
|
||||
|
MKS Robin Nano |
||||
|
U5 W25Q64BV, 16K SERIAL EEPROM: |
||||
|
|
||||
|
|
||||
|
*/ |
||||
|
#include "../../inc/MarlinConfig.h" |
||||
|
|
||||
|
#if ENABLED(SPI_EEPROM_W25Q) |
||||
|
#include "../../libs/W25Qxx.h" |
||||
|
|
||||
|
//W25QXXFlash W25QXX;
|
||||
|
uint8_t spi_eeprom[MARLIN_EEPROM_SIZE]; |
||||
|
|
||||
|
void eeprom_test(void); |
||||
|
|
||||
|
void eeprom_init(void){ |
||||
|
DEBUG("Start EEPROM"); |
||||
|
W25QXX.init(SPI_EIGHTH_SPEED); |
||||
|
//eeprom_test();
|
||||
|
W25QXX.SPI_FLASH_BufferRead((uint8_t *)spi_eeprom,SPI_EEPROM_OFFSET,MARLIN_EEPROM_SIZE); |
||||
|
} |
||||
|
|
||||
|
void eeprom_hw_deinit(void){ |
||||
|
DEBUG("Finish EEPROM"); |
||||
|
W25QXX.SPI_FLASH_WriteEnable(); |
||||
|
W25QXX.SPI_FLASH_SectorErase(SPI_EEPROM_OFFSET); |
||||
|
//write
|
||||
|
W25QXX.SPI_FLASH_BufferWrite((uint8_t *)spi_eeprom,SPI_EEPROM_OFFSET,MARLIN_EEPROM_SIZE); |
||||
|
} |
||||
|
|
||||
|
void eeprom_write_byte(uint8_t *pos, unsigned char value){ |
||||
|
uint16_t addr=(unsigned)pos; |
||||
|
|
||||
|
if(addr < MARLIN_EEPROM_SIZE){ |
||||
|
spi_eeprom[addr]=value; |
||||
|
}else{ |
||||
|
ERROR("Write out of SPI size: %d %d",addr,MARLIN_EEPROM_SIZE); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
uint8_t eeprom_read_byte(uint8_t *pos) { |
||||
|
uint16_t addr=(unsigned)pos; |
||||
|
|
||||
|
if(addr < MARLIN_EEPROM_SIZE){ |
||||
|
return spi_eeprom[addr]; |
||||
|
}else{ |
||||
|
ERROR("Read out of SPI size: %d %d",addr,MARLIN_EEPROM_SIZE); |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void eeprom_read_block(void *__dst, const void *__src, size_t __n){ |
||||
|
ERROR("Call to missing function"); |
||||
|
}; |
||||
|
|
||||
|
void eeprom_update_block(const void *__src, void *__dst, size_t __n){ |
||||
|
ERROR("Call to missing function"); |
||||
|
}; |
||||
|
|
||||
|
void eeprom_test(void){ |
||||
|
DEBUG("SPI Flash ID %0X",W25QXX.W25QXX_ReadID()); |
||||
|
DEBUG("Read FLASH:"); |
||||
|
for(uint32_t i=0; i < 50 ; ){ |
||||
|
memset(spi_eeprom,0,10); |
||||
|
W25QXX.SPI_FLASH_BufferRead((uint8_t *)spi_eeprom,SPI_EEPROM_OFFSET+i,10); |
||||
|
DEBUG("%d %0X %0X %0X %0X %0X %0X %0X %0X %0X %0X",i,spi_eeprom[0],spi_eeprom[1],spi_eeprom[2],spi_eeprom[3],spi_eeprom[4],spi_eeprom[5],spi_eeprom[6],spi_eeprom[7],spi_eeprom[8],spi_eeprom[9]); |
||||
|
i=i+10; |
||||
|
} |
||||
|
|
||||
|
DEBUG("Erase flash"); |
||||
|
W25QXX.SPI_FLASH_WriteEnable(); |
||||
|
W25QXX.SPI_FLASH_SectorErase(SPI_EEPROM_OFFSET); |
||||
|
|
||||
|
DEBUG("Read FLASH:"); |
||||
|
for(uint32_t i=0; i < 50 ; ){ |
||||
|
memset(spi_eeprom,0,10); |
||||
|
W25QXX.SPI_FLASH_BufferRead((uint8_t *)spi_eeprom,SPI_EEPROM_OFFSET+i,10); |
||||
|
DEBUG("%d %0X %0X %0X %0X %0X %0X %0X %0X %0X %0X",i,spi_eeprom[0],spi_eeprom[1],spi_eeprom[2],spi_eeprom[3],spi_eeprom[4],spi_eeprom[5],spi_eeprom[6],spi_eeprom[7],spi_eeprom[8],spi_eeprom[9]); |
||||
|
i=i+10; |
||||
|
} |
||||
|
|
||||
|
DEBUG("Read/write FLASH:"); |
||||
|
for(uint32_t i=0; i < 50 ; ){ |
||||
|
|
||||
|
memset(spi_eeprom,0x0B,10); |
||||
|
|
||||
|
W25QXX.SPI_FLASH_WriteEnable(); |
||||
|
W25QXX.SPI_FLASH_BufferWrite((uint8_t *)spi_eeprom,SPI_EEPROM_OFFSET+i,10); |
||||
|
|
||||
|
W25QXX.SPI_FLASH_BufferRead((uint8_t *)spi_eeprom,SPI_EEPROM_OFFSET+i,10); |
||||
|
DEBUG("%d %0X %0X %0X %0X %0X %0X %0X %0X %0X %0X",i,spi_eeprom[0],spi_eeprom[1],spi_eeprom[2],spi_eeprom[3],spi_eeprom[4],spi_eeprom[5],spi_eeprom[6],spi_eeprom[7],spi_eeprom[8],spi_eeprom[9]); |
||||
|
i=i+10; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
#endif // SPI_EEPROM_W25Q
|
@ -0,0 +1,164 @@ |
|||||
|
#include "mks_wifi_hal_f1.h" |
||||
|
#include "../../libs/Segger/log.h" |
||||
|
|
||||
|
|
||||
|
#ifdef STM32F1 |
||||
|
|
||||
|
#ifdef MAPLE_STM32F1 |
||||
|
#include "stm32f103xe.h" |
||||
|
#else |
||||
|
#include "../../MarlinCore.h" |
||||
|
#endif |
||||
|
|
||||
|
volatile unsigned char *buff; |
||||
|
volatile unsigned char buffer_ready; |
||||
|
volatile unsigned char dma_stopped; |
||||
|
|
||||
|
volatile __attribute__ ((aligned (4))) unsigned int *dma_buff[2]; |
||||
|
volatile unsigned char dma_buff_index=0; |
||||
|
|
||||
|
|
||||
|
void mks_wifi_hw_prepare(unsigned int buf, unsigned int count){ |
||||
|
//На время передачи отключение systick
|
||||
|
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; |
||||
|
|
||||
|
//Отключение тактирования не используемых блоков
|
||||
|
RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN|RCC_APB1ENR_TIM4EN); |
||||
|
RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN|RCC_APB1ENR_USART3EN); |
||||
|
RCC->APB2ENR &= ~RCC_APB2ENR_TIM1EN; |
||||
|
RCC->AHBENR &= ~(RCC_AHBENR_FSMCEN); |
||||
|
|
||||
|
//Максимальная частота в режиме out
|
||||
|
GPIOC->CRL |= GPIO_CRL_MODE7; |
||||
|
GPIOC->CRL &= ~GPIO_CRL_CNF7; |
||||
|
|
||||
|
RCC->APB2RSTR |= RCC_APB2RSTR_USART1RST; |
||||
|
RCC->APB2RSTR &= ~RCC_APB2RSTR_USART1RST; |
||||
|
|
||||
|
USART1->CR1 = USART_CR1_UE; |
||||
|
USART1->BRR = 0x25; |
||||
|
USART1->CR2 = 0; |
||||
|
USART1->CR3 = USART_CR3_DMAR; |
||||
|
USART1->SR = 0; |
||||
|
USART1->CR1 |= USART_CR1_RE; |
||||
|
|
||||
|
DMA1_Channel5->CCR = DMA_CONF; |
||||
|
DMA1_Channel5->CPAR = (uint32_t)&USART1->DR; |
||||
|
DMA1_Channel5->CMAR = (uint32_t)buf; //dma_buff[dma_buff_index];
|
||||
|
DMA1_Channel5->CNDTR = count; //ESP_PACKET_SIZE;
|
||||
|
DMA1->IFCR = DMA_IFCR_CGIF5|DMA_IFCR_CTEIF5|DMA_IFCR_CHTIF5|DMA_IFCR_CTCIF5; |
||||
|
DMA1_Channel5->CCR = DMA_CONF|DMA_CCR_EN; |
||||
|
|
||||
|
NVIC_EnableIRQ(DMA1_Channel5_IRQn); |
||||
|
// DEBUG("Start DMA %0X / %d",buf, count);
|
||||
|
// DEBUG("CCRR %0X",DMA1_Channel5->CCR);
|
||||
|
// DEBUG("CMAR %0X",DMA1_Channel5->CMAR);
|
||||
|
// DEBUG("CPAR %0X",DMA1_Channel5->CPAR);
|
||||
|
// DEBUG("NDTR %0X",DMA1_Channel5->CNDTR);
|
||||
|
// DEBUG("IFC %0X",DMA1->IFCR);
|
||||
|
|
||||
|
// DEBUG("USART CR1 %0X",USART1->CR1);
|
||||
|
// DEBUG("CR2 %0X",USART1->CR2);
|
||||
|
// DEBUG("CR3 %0X",USART1->CR3);
|
||||
|
// DEBUG("BRR %0X",USART1->BRR);
|
||||
|
// DEBUG("SR %0X",USART1->SR);
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mks_wifi_hw_restore(void){ |
||||
|
//Включение обратно переферии
|
||||
|
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; |
||||
|
RCC->APB1ENR |= (RCC_APB1ENR_TIM5EN|RCC_APB1ENR_TIM4EN); |
||||
|
RCC->APB1ENR |= (RCC_APB1ENR_SPI2EN|RCC_APB1ENR_USART3EN); |
||||
|
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; |
||||
|
RCC->AHBENR |= (RCC_AHBENR_FSMCEN); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mks_wifi_disable_dma(void){ |
||||
|
DMA1->IFCR = DMA_IFCR_CGIF5|DMA_IFCR_CTEIF5|DMA_IFCR_CHTIF5|DMA_IFCR_CTCIF5; |
||||
|
DMA1_Channel5->CCR = 0; |
||||
|
NVIC_DisableIRQ(DMA1_Channel5_IRQn); |
||||
|
} |
||||
|
|
||||
|
void mks_wifi_empty_uart(void){ |
||||
|
while(USART1->SR & USART_SR_RXNE){ |
||||
|
(void)USART1->DR; |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
void wd_reset(void){ |
||||
|
#ifdef MAPLE_STM32F1 |
||||
|
IWDG->KR = 0xAAAA; |
||||
|
#else |
||||
|
HAL_watchdog_refresh(); |
||||
|
#endif |
||||
|
} |
||||
|
|
||||
|
#ifdef MAPLE_STM32F1 |
||||
|
extern "C" void __irq_dma1_channel5(void) { |
||||
|
#else |
||||
|
extern "C" void DMA1_Channel5_IRQHandler(void){ |
||||
|
#endif |
||||
|
if(DMA1->ISR & DMA_ISR_TEIF5){ |
||||
|
DEBUG("DMA Error"); |
||||
|
dma_stopped = 2; |
||||
|
DMA1->IFCR = DMA_CLEAR; |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if(buffer_ready > 0){ |
||||
|
GPIOC->BSRR = GPIO_BSRR_BS7; //остановить передачу от esp
|
||||
|
dma_stopped=1; |
||||
|
}; |
||||
|
|
||||
|
DMA1->IFCR = DMA_CLEAR; |
||||
|
//Указатель на полученный буфер
|
||||
|
buff=(unsigned char*)dma_buff[dma_buff_index]; |
||||
|
//переключить индекс
|
||||
|
dma_buff_index = (dma_buff_index) ? 0 : 1; |
||||
|
|
||||
|
DMA1_Channel5->CCR = DMA_CONF; |
||||
|
DMA1_Channel5->CMAR = (uint32_t)dma_buff[dma_buff_index]; |
||||
|
DMA1_Channel5->CNDTR = ESP_PACKET_SIZE; |
||||
|
DMA1_Channel5->CCR = DMA_CONF|DMA_CCR_EN; |
||||
|
++buffer_ready; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mks_wifi_sys_rst(void){ |
||||
|
|
||||
|
#ifdef MAPLE_STM32F1 |
||||
|
asm volatile ("dsb 0xF":::"memory"); |
||||
|
SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)|(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk)|SCB_AIRCR_SYSRESETREQ_Msk); |
||||
|
asm volatile ("dsb 0xF":::"memory"); |
||||
|
while(1); |
||||
|
#else |
||||
|
NVIC_SystemReset(); |
||||
|
#endif |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#ifdef MAPLE_STM32F1 |
||||
|
#define __NVIC_PRIO_BITS 4U |
||||
|
|
||||
|
void NVIC_SetPriority(int IRQn, unsigned int priority){ |
||||
|
if ((int)(IRQn) < 0){ |
||||
|
SCB->SHP[(((unsigned int)(int)IRQn) & 0xFUL)-4UL] = (unsigned char)((priority << (8U - __NVIC_PRIO_BITS)) & (unsigned int)0xFFUL); |
||||
|
}else{ |
||||
|
NVIC->IP[((unsigned int)(int)IRQn)] = (unsigned char)((priority << (8U - __NVIC_PRIO_BITS)) & (unsigned int)0xFFUL); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void NVIC_EnableIRQ(int IRQn){ |
||||
|
NVIC->ISER[(((unsigned int)(int)IRQn) >> 5UL)] = (unsigned int)(1UL << (((unsigned int)(int)IRQn) & 0x1FUL)); |
||||
|
} |
||||
|
|
||||
|
void NVIC_DisableIRQ(int IRQn){ |
||||
|
NVIC->ICER[(((unsigned int)(int)IRQn) >> 5UL)] = (unsigned int)(1UL << (((unsigned int)(int)IRQn) & 0x1FUL)); |
||||
|
} |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
#endif |
@ -0,0 +1,23 @@ |
|||||
|
#ifndef MKS_WIFI_HAL_F1_H |
||||
|
#define MKS_WIFI_HAL_F1_H |
||||
|
|
||||
|
#define DMA_TIMEOUT 0x1ffffff |
||||
|
#define ESP_PACKET_SIZE 1024 |
||||
|
|
||||
|
#define DMA_CONF (unsigned int)(DMA_CCR_PL|DMA_CCR_MINC|DMA_CCR_TEIE|DMA_CCR_TCIE) |
||||
|
#define DMA_CLEAR (unsigned int)(DMA_IFCR_CGIF5|DMA_IFCR_CTEIF5|DMA_IFCR_CHTIF5|DMA_IFCR_CTCIF5) |
||||
|
|
||||
|
void mks_wifi_hw_prepare(unsigned int buf, unsigned int count); |
||||
|
void mks_wifi_empty_uart(void); |
||||
|
void mks_wifi_hw_restore(void); |
||||
|
void mks_wifi_disable_dma(void); |
||||
|
void mks_wifi_sys_rst(void); |
||||
|
void wd_reset(void); |
||||
|
|
||||
|
#ifdef MAPLE_STM32F1 |
||||
|
void NVIC_SetPriority(int IRQn, unsigned int priority); |
||||
|
void NVIC_EnableIRQ(int IRQn); |
||||
|
void NVIC_DisableIRQ(int IRQn); |
||||
|
#endif |
||||
|
|
||||
|
#endif |
@ -0,0 +1,98 @@ |
|||||
|
#include "mks_wifi_hal_f4.h" |
||||
|
|
||||
|
#ifdef STM32F4 |
||||
|
volatile unsigned char *buff; |
||||
|
volatile unsigned char buffer_ready; |
||||
|
volatile unsigned char dma_stopped; |
||||
|
|
||||
|
volatile __attribute__ ((aligned (4))) unsigned int *dma_buff[2]; |
||||
|
volatile unsigned char dma_buff_index=0; |
||||
|
|
||||
|
|
||||
|
void mks_wifi_hw_prepare(unsigned int buf, unsigned int count){ |
||||
|
//На время передачи отключение systick
|
||||
|
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; |
||||
|
|
||||
|
RCC->APB1ENR &= ~RCC_APB1ENR_TIM5EN; |
||||
|
RCC->APB2ENR &= ~RCC_APB2ENR_TIM10EN; |
||||
|
|
||||
|
RCC->APB2RSTR |= RCC_APB2RSTR_USART1RST; |
||||
|
RCC->APB2RSTR &= ~RCC_APB2RSTR_USART1RST; |
||||
|
|
||||
|
USART1->CR1 = USART_CR1_UE; |
||||
|
USART1->CR1 = USART_CR1_TE | USART_CR1_UE; |
||||
|
USART1->BRR = (uint32_t)(84000000+1958400/2)/1958400; |
||||
|
USART1->CR2 = 0; |
||||
|
USART1->CR3 = USART_CR3_DMAR; |
||||
|
USART1->SR = 0; |
||||
|
USART1->CR1 |= USART_CR1_RE; |
||||
|
|
||||
|
DMA2_Stream5->CR = 0; |
||||
|
DMA2->HIFCR=DMA_S5_CLEAR; |
||||
|
|
||||
|
DMA2_Stream5->PAR = (uint32_t)&USART1->DR; |
||||
|
DMA2_Stream5->M0AR = (uint32_t)buf; |
||||
|
DMA2_Stream5->NDTR = count; |
||||
|
|
||||
|
DMA2_Stream5->CR = DMA_CONF|DMA_SxCR_EN; |
||||
|
|
||||
|
NVIC_EnableIRQ(DMA2_Stream5_IRQn); |
||||
|
}; |
||||
|
|
||||
|
void mks_wifi_disable_dma(void){ |
||||
|
DMA2->HIFCR=DMA_S5_CLEAR; |
||||
|
DMA2_Stream5->CR = 0; |
||||
|
} |
||||
|
|
||||
|
void mks_wifi_empty_uart(void){ |
||||
|
while(USART1->SR & USART_SR_RXNE){ |
||||
|
(void)USART1->DR; |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
void wd_reset(void){ |
||||
|
HAL_watchdog_refresh(); |
||||
|
} |
||||
|
|
||||
|
void mks_wifi_hw_restore(void){ |
||||
|
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN; |
||||
|
RCC->APB2ENR |= RCC_APB2ENR_TIM10EN; |
||||
|
|
||||
|
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; |
||||
|
} |
||||
|
|
||||
|
void mks_wifi_sys_rst(void){ |
||||
|
NVIC_SystemReset(); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
extern "C" void DMA2_Stream5_IRQHandler(void){ |
||||
|
|
||||
|
if(DMA2->HISR & DMA_HISR_TEIF5){ |
||||
|
DEBUG("DMA Error"); |
||||
|
dma_stopped = 2; |
||||
|
DMA2->HIFCR=DMA_S5_CLEAR; |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if(buffer_ready > 0){ |
||||
|
GPIOC->BSRR = GPIO_BSRR_BS7; //остановить передачу от esp
|
||||
|
dma_stopped=1; |
||||
|
}; |
||||
|
|
||||
|
DMA2->HIFCR=DMA_S5_CLEAR; |
||||
|
//Указатель на полученный буфер
|
||||
|
buff=(unsigned char*)dma_buff[dma_buff_index]; |
||||
|
//переключить индекс
|
||||
|
dma_buff_index = (dma_buff_index) ? 0 : 1; |
||||
|
|
||||
|
|
||||
|
DMA2_Stream5->CR = DMA_CONF; |
||||
|
DMA2_Stream5->M0AR = (uint32_t)dma_buff[dma_buff_index]; |
||||
|
DMA2_Stream5->NDTR = ESP_PACKET_SIZE; |
||||
|
DMA2_Stream5->CR = DMA_CONF|DMA_SxCR_EN; |
||||
|
|
||||
|
++buffer_ready; |
||||
|
} |
||||
|
|
||||
|
#endif |
@ -0,0 +1,34 @@ |
|||||
|
#ifndef MKS_WIFI_HAL_F4_H |
||||
|
#define MKS_WIFI_HAL_F4_H |
||||
|
|
||||
|
#include "../../MarlinCore.h" |
||||
|
|
||||
|
#define DMA_TIMEOUT 0x1ffffff |
||||
|
#define ESP_PACKET_SIZE 1024 |
||||
|
|
||||
|
#define DMA_CONF ((uint32_t)( (0x04 << DMA_SxCR_CHSEL_Pos) | \ |
||||
|
(0x00 << DMA_SxCR_MBURST_Pos)| \ |
||||
|
(0x00 << DMA_SxCR_PBURST_Pos)| \ |
||||
|
(0x00 << DMA_SxCR_DBM_Pos) | \ |
||||
|
(0x00 << DMA_SxCR_PL_Pos) | \ |
||||
|
(0x00 << DMA_SxCR_PINCOS_Pos)| \ |
||||
|
(0x00 << DMA_SxCR_MSIZE_Pos) | \ |
||||
|
(0x00 << DMA_SxCR_PSIZE_Pos) | \ |
||||
|
(0x01 << DMA_SxCR_MINC_Pos) | \ |
||||
|
(0x00 << DMA_SxCR_PINC_Pos) | \ |
||||
|
(0x00 << DMA_SxCR_CIRC_Pos) | \ |
||||
|
(0x01 << DMA_SxCR_TCIE_Pos) | \ |
||||
|
(0x01 << DMA_SxCR_TEIE_Pos) | \ |
||||
|
(0x00 << DMA_SxCR_PFCTRL_Pos))) |
||||
|
|
||||
|
#define DMA_S5_CLEAR (uint32_t)(DMA_HIFCR_CTCIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5 | DMA_HIFCR_CHTIF5) |
||||
|
|
||||
|
|
||||
|
void mks_wifi_hw_prepare(unsigned int buf, unsigned int count); |
||||
|
void mks_wifi_hw_restore(void); |
||||
|
void mks_wifi_sys_rst(void); |
||||
|
void wd_reset(void); |
||||
|
void mks_wifi_empty_uart(void); |
||||
|
void mks_wifi_disable_dma(void); |
||||
|
|
||||
|
#endif |
File diff suppressed because it is too large
Loading…
Reference in new issue