日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F030使用硬件SPI与字库芯片通信

發布時間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F030使用硬件SPI与字库芯片通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STM32F030使用硬件SPI與字庫芯片通信

前言

在淘寶買了350-019-PC 3.5寸TFT彩屏,賣家提供了DEMO程序是軟件模擬SPI的,但這種程序只能用于演示,實際使用其通訊速率遠遠不能夠滿足要求。因此在轉換為STM32自帶的SPI通訊的時候,ST7796S驅動由于是只發送不接受,因此很快就能夠調通,但是模塊上的字庫芯片是就調試了好幾天都一直無法調通,網上也查詢了很多資料依然無法解決,最后是給詢問我同事之后才終于解決,最后才知道我對硬件SPI有有誤解才導致了這次的問題,為了讓自己長記性,因此寫了這個博文。

基本信息

單 片 機: STM32F030C8Tx
通信接口:SPI2
字庫芯片: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); }

字庫驅動代碼

/****送指令到晶聯訊字庫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 }/****從晶聯訊字庫IC中取漢字或字符數據(1個字節)***/ 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 }

字庫通信代碼

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); //這一句相當于寫了一行8個像素點的數據。}}ROM_CS_Set(); }

主要問題點:

  • 可以從上面的代碼看到,在通信的過程中,會先發送三個字節的地址,接著就一直讀取數據。
  • 如果字庫的讀取驅動按照我屏蔽的方式去通信,由于SPI是全雙工通信,那么在發送完三個字節的地址數據之后,接著一直調用讀取的接口,此時只會讀取到一個數據,接著就讀取不到數據,則一直會進入到等待數據的死循環中while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET),主要原因是因為調用SPI_ReceiveData8(SPI2)是直接從寄存器中獲取數據,此時是不產生時鐘信號的,這點就是我一直誤解的點,因此想要產生時鐘數據則需要每次在讀取前發送個0x00數據才能夠有時鐘信號,進行全雙工通信正常獲取到數據。
  • 總結

    以上是生活随笔為你收集整理的STM32F030使用硬件SPI与字库芯片通信的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。