//初始化VS10XX的IO口 void VS_Init(void) { #ifdef USE_MICO_SPI2 if ( kNoErr != MicoSpiInitialize( &mico_spi_VS10XX) ) { /*@-mustdefine@*/ /* Lint: failed - do not define platform peripheral */ return; /*@+mustdefine@*/ } #else MicoGpioInitialize((mico_gpio_t)VS_SO_PIN, INPUT_PULL_UP); MicoGpioInitialize( (mico_gpio_t)VS_SI_PIN, OUTPUT_PUSH_PULL ); MicoGpioInitialize( (mico_gpio_t)VS_SCK_PIN, OUTPUT_PUSH_PULL ); #endif MicoGpioInitialize((mico_gpio_t)VS_DQ_PIN, INPUT_PULL_UP); MicoGpioInitialize( (mico_gpio_t)VS_RST_PIN, OUTPUT_PUSH_PULL ); MicoGpioInitialize( (mico_gpio_t)VS_XCS_PIN, OUTPUT_PUSH_PULL ); MicoGpioInitialize( (mico_gpio_t)VS_XDCS_PIN, OUTPUT_PUSH_PULL ); return; }
int sflash_platform_init ( /*@shared@*/ void* peripheral_id, /*@out@*/ void** platform_peripheral_out ) { UNUSED_PARAMETER( peripheral_id ); /* Unused due to single SPI Flash */ if ( kNoErr != MicoSpiInitialize( &mico_spi_flash ) ) { /*@-mustdefine@*/ /* Lint: failed - do not define platform peripheral */ return -1; /*@+mustdefine@*/ } if( platform_peripheral_out != NULL) *platform_peripheral_out = NULL; return 0; }
OSStatus MicoSpiTransfer( const mico_spi_device_t* spi, mico_spi_message_segment_t* segments, uint16_t number_of_segments ) { OSStatus result = kNoErr; uint16_t i; uint32_t count = 0; check_string( (spi != NULL) && (segments != NULL) && (number_of_segments != 0), "Bad args"); MicoMcuPowerSaveConfig(false); /* If the given SPI device is not the current SPI device, initialise */ if ( spi != current_spi_device ) { MicoSpiInitialize( spi ); } /* Activate chip select */ MicoGpioOutputLow(spi->chip_select); for ( i = 0; i < number_of_segments; i++ ) { /* Check if we are using DMA */ if ( spi->mode & SPI_USE_DMA ) { spi_dma_config( spi, &segments[i] ); result = spi_dma_transfer( spi ); if ( result != kNoErr ) { goto cleanup_transfer; } } else { /* in interrupt-less mode */ if ( spi->bits == 8 ) { const uint8_t* send_ptr = ( const uint8_t* )segments[i].tx_buffer; uint8_t* rcv_ptr = ( uint8_t* )segments[i].rx_buffer; count = segments[i].length; while ( count-- ) { uint16_t data; if ( send_ptr != NULL ) { data = *send_ptr; send_ptr++; } else { data = 0xFF; } /* Wait until the transmit buffer is empty */ while ( SPI_I2S_GetFlagStatus( spi_mapping[spi->port].spi_regs, SPI_I2S_FLAG_TXE ) == RESET ) {} /* Send the byte */ SPI_I2S_SendData( spi_mapping[spi->port].spi_regs, data ); /* Wait until a data is received */ while ( SPI_I2S_GetFlagStatus( spi_mapping[spi->port].spi_regs, SPI_I2S_FLAG_RXNE ) == RESET ) {} /* Get the received data */ data = SPI_I2S_ReceiveData( spi_mapping[spi->port].spi_regs ); if ( rcv_ptr != NULL ) { *rcv_ptr++ = (uint8_t)data; } } } else if ( spi->bits == 16 ) { const uint16_t* send_ptr = (const uint16_t *) segments[i].tx_buffer; uint16_t* rcv_ptr = (uint16_t *) segments[i].rx_buffer; /* Check that the message length is a multiple of 2 */ if ( ( count % 2 ) == 0 ) { result = kGeneralErr; goto cleanup_transfer; } while ( count != 0) { uint16_t data = 0xFFFF; count -= 2; if ( send_ptr != NULL ) { data = *send_ptr++; } /* Wait until the transmit buffer is empty */ while ( SPI_I2S_GetFlagStatus( spi_mapping[spi->port].spi_regs, SPI_I2S_FLAG_TXE ) == RESET ) {} /* Send the byte */ SPI_I2S_SendData( spi_mapping[spi->port].spi_regs, data ); /* Wait until a data is received */ while ( SPI_I2S_GetFlagStatus( spi_mapping[spi->port].spi_regs, SPI_I2S_FLAG_RXNE ) == RESET ) {} /* Get the received data */ data = SPI_I2S_ReceiveData( spi_mapping[spi->port].spi_regs ); if ( rcv_ptr != NULL ) { *rcv_ptr++ = data; } } } } } cleanup_transfer: MicoGpioOutputHigh(spi->chip_select); MicoMcuPowerSaveConfig(true); return result; }
//初始化SSD1306 void OLED_Init(void) { /* GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); //使能PC,D,G端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8; //PD3,PD6推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD3,6 GPIO_SetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8); //PD3,PD6 输出高 #if OLED_MODE==1 GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 OUT推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,0xFF); //PC0~7输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //PG13,14,15 OUT推挽输出 GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PG13,14,15 OUT 输出高 #else GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PC0,1 OUT推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1); //PC0,1 OUT 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PG15 OUT推挽输出 RST GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_15); //PG15 OUT 输出高 #endif */ // MicoGpioInitialize( (mico_gpio_t)OLED_SPI_SCK, OUTPUT_PUSH_PULL ); // MicoGpioInitialize( (mico_gpio_t)OLED_SPI_DIN, OUTPUT_PUSH_PULL ); // MicoGpioInitialize( (mico_gpio_t)OLED_SPI_DC, OUTPUT_PUSH_PULL ); // MicoGpioInitialize( (mico_gpio_t)OLED_SPI_CS, OUTPUT_PUSH_PULL ); // // OLED_CS_Set(); OSStatus err = kUnknownErr; err = MicoSpiInitialize(&micokit_spi_oled); UNUSED_PARAMETER(err); MicoGpioInitialize( (mico_gpio_t)OLED_SPI_DC, OUTPUT_PUSH_PULL ); OLED_DC_Clr(); OLED_RST_Clr(); OLED_RST_Set(); delay_ms(100); OLED_RST_Clr(); delay_ms(100); OLED_RST_Set(); OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel OLED_WR_Byte(0x00,OLED_CMD);//---set low column address OLED_WR_Byte(0x10,OLED_CMD);//---set high column address OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64) OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) OLED_WR_Byte(0x00,OLED_CMD);//-not offset OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02) OLED_WR_Byte(0x02,OLED_CMD);// OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5) OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear(); OLED_Set_Pos(0,0); }