STM32F030使用硬件SPI与字库芯片通信
生活随笔
收集整理的這篇文章主要介紹了
STM32F030使用硬件SPI与字库芯片通信
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
STM32F030使用硬件SPI與字庫(kù)芯片通信
前言
在淘寶買(mǎi)了350-019-PC 3.5寸TFT彩屏,賣(mài)家提供了DEMO程序是軟件模擬SPI的,但這種程序只能用于演示,實(shí)際使用其通訊速率遠(yuǎn)遠(yuǎn)不能夠滿(mǎn)足要求。因此在轉(zhuǎn)換為STM32自帶的SPI通訊的時(shí)候,ST7796S驅(qū)動(dòng)由于是只發(fā)送不接受,因此很快就能夠調(diào)通,但是模塊上的字庫(kù)芯片是就調(diào)試了好幾天都一直無(wú)法調(diào)通,網(wǎng)上也查詢(xún)了很多資料依然無(wú)法解決,最后是給詢(xún)問(wèn)我同事之后才終于解決,最后才知道我對(duì)硬件SPI有有誤解才導(dǎo)致了這次的問(wèn)題,為了讓自己長(zhǎng)記性,因此寫(xiě)了這個(gè)博文。
基本信息
單 片 機(jī): STM32F030C8Tx
通信接口:SPI2
字庫(kù)芯片:JLX-GB2312-3205
SPI的代碼
void SPI2_init(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF ;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_Level_3;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_0);GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_0);GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_0);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOB, &GPIO_InitStructure);SPI_I2S_DeInit(SPI2); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure);SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF); SPI_Cmd(SPI2, ENABLE); }void SPI2_WriteByte(uint8_t data) {while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_SendData8(SPI2, data); }uint8_t SPI2_ReadByte(void) {while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);return SPI_ReceiveData8(SPI2); } uint8_t SPI2_Transfer(uint8_t data) {while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_SendData8(SPI2, data);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);return SPI_ReceiveData8(SPI2); }字庫(kù)驅(qū)動(dòng)代碼
/****送指令到晶聯(lián)訊字庫(kù)IC***/ void send_command_to_ROM( u16 datu ) { #ifdef LCD_USE_HW_SPI//SPI2_WriteByte(datu);SPI2_Transfer(datu); #else u16 i;for(i=0;i<8;i++ ){if(datu&0x80)ROM_MOSI_Set(); elseROM_MOSI_Clr(); datu = datu<<1;ROM_CLK_Clr();ROM_CLK_Set();} #endif }/****從晶聯(lián)訊字庫(kù)IC中取漢字或字符數(shù)據(jù)(1個(gè)字節(jié))***/ static u8 get_data_from_ROM(void) { #ifdef LCD_USE_HW_SPIreturn SPI2_Transfer(0x00);//return SPI2_ReadByte(); #elseu16 i;u16 ret_data=0;ROM_CLK_Set();for(i=0;i<8;i++){ROM_MISO_Set();ROM_CLK_Clr();ret_data=ret_data<<1;if( ROM_MISO_Get())ret_data=ret_data+1;elseret_data=ret_data+0;ROM_CLK_Set();}return(ret_data); #endif }字庫(kù)通信代碼
void get_and_write_32x32(u32 fontaddr,u16 x,u16 y,u16 font_color,u16 back_color) {u16 i,j,disp_data;ROM_CS_Clr();send_command_to_ROM(0x03);send_command_to_ROM((fontaddr&0xff0000)>>16); //地址的高8位,共24位send_command_to_ROM((fontaddr&0xff00)>>8); //地址的中8位,共24位send_command_to_ROM(fontaddr&0xff); //地址的低8位,共24位for(j=0;j<32;j++){lcd_address(y,x+j,32,32); for(i=0;i<4;i++){disp_data=get_data_from_ROM();mono_data_out(disp_data,font_color,back_color); //這一句相當(dāng)于寫(xiě)了一行8個(gè)像素點(diǎn)的數(shù)據(jù)。}}ROM_CS_Set(); }主要問(wèn)題點(diǎn):
總結(jié)
以上是生活随笔為你收集整理的STM32F030使用硬件SPI与字库芯片通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Sessions, Window Sta
- 下一篇: 除了Office和wps,还有什么办公软