在CW32生態(tài)社區(qū)以極高的性價(jià)比入手了這塊CW32L012開(kāi)發(fā)評(píng)估板,開(kāi)發(fā)板以底板、核心板、1.77寸TFT顯示屏構(gòu)成,所有的IO口都引出了排針,這點(diǎn)好評(píng),使用杜邦線可以非常方便的連接其他模塊。引腳、接口模塊的布局都非常合理,并且整板子都使用了黑色,顏值也杠杠在線的,非常方便我用來(lái)學(xué)習(xí)這顆芯片。這里邊還有一個(gè)非常小的細(xì)節(jié),這個(gè)細(xì)小的設(shè)計(jì)很貼中我的使用習(xí)慣,核心板中的功能按鍵和復(fù)位按鍵進(jìn)行了區(qū)分,白色的按鍵是功能按鍵,紅色的按鍵才是復(fù)位按鍵,讓我這種分不清左邊是復(fù)位按鍵還是右邊是復(fù)位按鍵的人一下就能按中復(fù)位按鍵了;
開(kāi)發(fā)板介紹

這款開(kāi)發(fā)評(píng)估板的設(shè)計(jì)非常巧妙,首先是電源部分,給出了一個(gè)12V的DC直流電源插口,有自恢復(fù)保險(xiǎn)絲和保證電流單項(xiàng)導(dǎo)通的二極管,7805線性穩(wěn)壓器將電壓從15V的電壓穩(wěn)壓到5V,需要用到5V電壓的模塊此時(shí)接到這里完成5V供電,同時(shí)我們的芯片也從這里獲得5V的供電,這款芯片是寬電壓的芯片,用5V是完全沒(méi)有問(wèn)題的;AMS1117-3.3是一款非常經(jīng)典的5V穩(wěn)壓到3.3V的線性穩(wěn)壓器,此時(shí)需要用到3.3V的模塊在這里供電,在開(kāi)發(fā)板的右側(cè)區(qū)域預(yù)留了大量的+5V、+3V3、GND的排針,方便外接模塊供電,這就是電源部分。

接著是顯示屏幕區(qū)域,這塊開(kāi)發(fā)板做足的對(duì)屏幕的兼容,對(duì)0.91OLED,0.96OLED,1.77TFT屏幕都兼容,接口方面是4線SPI,2線的I2C,官方默認(rèn)給配置的是一個(gè)8針的1.77TFT屏幕,在這篇文章我將著重介紹4線SPI,通過(guò)軟件模擬來(lái)實(shí)現(xiàn)SPI通訊協(xié)議,并測(cè)量其通訊速率。

板載的模塊設(shè)計(jì)了一個(gè)有源蜂鳴器,通過(guò)MCU的PB3引腳來(lái)控制SS8050三極管來(lái)開(kāi)關(guān)斷蜂鳴器,可以完成蜂鳴器相關(guān)的實(shí)驗(yàn),三個(gè)按鍵分別是KEY1,KEY2,KEY3,三個(gè)LED燈分別是LED1,LED2,LED3,對(duì)應(yīng)MCU的PB13,PB14,PB15,PA7,PA8,PC13,LED燈是低電平點(diǎn)亮,可以完成流水燈以及按鍵電燈實(shí)驗(yàn),一個(gè)電位器,可以調(diào)節(jié)電阻的大小,對(duì)應(yīng)MCU的PB0口,通過(guò)調(diào)節(jié)電位器,來(lái)完成adc采集模擬電壓的實(shí)驗(yàn)。
在核心板區(qū)域提供了TYPE-C單獨(dú)供電,留出了4針的SWO程序調(diào)式口,有一個(gè)復(fù)位按鍵和一個(gè)功能按鍵,預(yù)留了一個(gè)外部高速晶振和一個(gè)低速晶振,高速晶振支持4-32MHz,低速晶振是32.768KHz的,這款芯片沒(méi)有PLL倍頻器,內(nèi)部時(shí)鐘頻率連接到外部高速晶振時(shí),外部高速晶振最高是多少,那么內(nèi)部時(shí)鐘頻率最高就是多少,但是這款芯片內(nèi)部的RC振蕩器是96MHz的,這個(gè)頻率可以滿足大部分使用場(chǎng)景,還可以節(jié)省使用外部晶振的成本,那么使用這款芯片的時(shí)候大概率就是使用內(nèi)部RC振蕩器了,官方也沒(méi)有配置外部晶振,只是設(shè)計(jì)了這個(gè)位置,估計(jì)也是和我有類似的考量吧。
最后這塊板子還提供了大量的外部模塊接口,可以拓展更多的模塊,增添了可玩性,由于這塊開(kāi)發(fā)板已經(jīng)極具性價(jià)比了,出于對(duì)成本的考量,官方是沒(méi)有配備拓展模塊,預(yù)留出來(lái)的模塊接口有8Pin的mpu6050,我們外接了這個(gè)模塊可以做一些與運(yùn)動(dòng)檢測(cè)相關(guān)的實(shí)驗(yàn),因?yàn)檫@個(gè)模塊是測(cè)量橫滾角、俯仰角、偏航角的,4Pin的電子秤模塊接口,可以做電子秤的實(shí)驗(yàn),2*4Pin的WIFI模塊,可以插ESP8266做物聯(lián)網(wǎng)相關(guān)的實(shí)驗(yàn),6Pin的藍(lán)牙模塊,可以做和手機(jī)通訊的實(shí)驗(yàn),9針的矩陣鍵盤接口,3Pin的溫濕度,插上dht11模塊可以測(cè)量溫度和濕度,以及預(yù)留了2個(gè)4針的串口,可以做串口通訊的實(shí)驗(yàn)。
原理圖
原理圖來(lái)源于CW32生態(tài)社區(qū),官方開(kāi)源了硬件原理圖;


SPI通訊簡(jiǎn)介
SPI,全稱為 串行外設(shè)接口,是一種高速、全雙工、同步的串行通信總線。它由摩托羅拉公司開(kāi)發(fā),因其簡(jiǎn)單和高效的特點(diǎn),被廣泛應(yīng)用于微控制器、傳感器、存儲(chǔ)器、SD卡、觸摸屏等設(shè)備之間的短距離通信。
一、核心特點(diǎn)
全雙工通信:數(shù)據(jù)可以同時(shí)在兩個(gè)方向上傳輸(主機(jī)發(fā)送數(shù)據(jù)的同時(shí),也能接收從機(jī)返回的數(shù)據(jù))。
同步通信:所有數(shù)據(jù)傳輸都由主機(jī)產(chǎn)生的時(shí)鐘信號(hào)同步,通信雙方無(wú)需預(yù)先配置波特率。
高速:相比I2C、UART等協(xié)議,SPI可以達(dá)到很高的通信速率(通??蛇_(dá)幾十MHz甚至更高)。
簡(jiǎn)單:協(xié)議本身非常簡(jiǎn)單,沒(méi)有復(fù)雜的地址幀和應(yīng)答機(jī)制,硬件實(shí)現(xiàn)也相對(duì)容易。
二、硬件連接(4線制)
一個(gè)標(biāo)準(zhǔn)的SPI總線需要至少4根信號(hào)線:
td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
| 信號(hào)線名稱 | 全稱 | 方向(以主機(jī)視角) | 功能描述 |
| SCLK | 串行時(shí)鐘 | 輸出 | 由主機(jī)產(chǎn)生,用于同步數(shù)據(jù)位傳輸?shù)臅r(shí)鐘信號(hào)。 |
| MOSI | 主設(shè)備輸出,從設(shè)備輸入 | 輸出 | 主機(jī)向從機(jī)發(fā)送數(shù)據(jù)的線路。 |
| MISO | 主設(shè)備輸入,從設(shè)備輸出 | 輸入 | 主機(jī)從從機(jī)接收數(shù)據(jù)的線路。 |
| CS/SS | 片選 / 從設(shè)備選擇 | 輸出 | 由主機(jī)控制,用于選中要進(jìn)行通信的特定從機(jī)。此信號(hào)通常低電平有效。 |
連接方式:
一主一從:連接最為簡(jiǎn)單,四根線直接相連即可。
一主多從(標(biāo)準(zhǔn)模式):這是最常用的方式。主機(jī)為每個(gè)從機(jī)提供獨(dú)立的片選信號(hào)。同一時(shí)刻,只有一個(gè)片選信號(hào)有效,從而選中一個(gè)從機(jī)進(jìn)行通信。
一主多從(菊花鏈模式):所有從機(jī)共用一根片選線,數(shù)據(jù)像鏈條一樣從一個(gè)從機(jī)傳遞到下一個(gè)。這種方式節(jié)省主機(jī)的I/O口,但軟件控制更復(fù)雜,且并非所有從設(shè)備都支持。
三、通信過(guò)程與工作原理
初始化:主機(jī)配置好時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA),這決定了時(shí)鐘的空閑狀態(tài)和數(shù)據(jù)的采樣邊沿。
選擇從機(jī):主機(jī)將目標(biāo)從機(jī)的CS引腳拉至低電平。
數(shù)據(jù)傳輸:
主機(jī)在SCLK時(shí)鐘線上產(chǎn)生時(shí)鐘脈沖。
在每個(gè)時(shí)鐘周期內(nèi),主機(jī)通過(guò)MOSI線發(fā)送一位數(shù)據(jù),同時(shí)通過(guò)MISO線讀取一位數(shù)據(jù)。
這意味著每次移位操作實(shí)際上是一次主從設(shè)備的數(shù)據(jù)交換。主機(jī)發(fā)送一個(gè)字節(jié)的同時(shí),也會(huì)收到從機(jī)返回的一個(gè)字節(jié)。
取消選擇:通信完成后,主機(jī)將CS引腳拉回高電平。
一個(gè)生動(dòng)的比喻:
可以把SPI通信想象成兩個(gè)面對(duì)面的的人(主機(jī)和從機(jī))在進(jìn)行一場(chǎng)同步的“說(shuō)聽(tīng)”練習(xí)。SCLK是節(jié)拍器,確保節(jié)奏一致。MOSI是主機(jī)說(shuō)話的通道,MISO是主機(jī)聽(tīng)音的通道。CS就像是主機(jī)決定是否要與對(duì)面的人對(duì)話的開(kāi)關(guān)。當(dāng)開(kāi)關(guān)打開(kāi)(CS拉低),隨著節(jié)拍器的每個(gè)節(jié)拍,主機(jī)說(shuō)一個(gè)字的同時(shí),也能聽(tīng)到對(duì)方回一個(gè)字。
四、時(shí)鐘極性與相位
這是SPI配置中的一個(gè)關(guān)鍵概念,決定了時(shí)鐘空閑時(shí)的電平和數(shù)據(jù)采樣的時(shí)刻。通過(guò)組合CPOL和CPHA,主要有四種模式:
td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
| 模式 | CPOL (時(shí)鐘極性) | CPHA (時(shí)鐘相位) | 時(shí)鐘空閑狀態(tài) | 數(shù)據(jù)采樣時(shí)刻 |
| 0 | 0 | 0 | 低電平 | 時(shí)鐘的第一個(gè)邊沿(上升沿) |
| 1 | 0 | 1 | 低電平 | 時(shí)鐘的第二個(gè)邊沿(下降沿) |
| 2 | 1 | 0 | 高電平 | 時(shí)鐘的第一個(gè)邊沿(下降沿) |
| 3 | 1 | 1 | 高電平 | 時(shí)鐘的第二個(gè)邊沿(上升沿) |
要點(diǎn):主設(shè)備和從設(shè)備必須工作在相同的模式下才能正常通信。
軟件模擬SPI通訊
總之,SPI是一種在嵌入式領(lǐng)域極其重要且實(shí)用的通訊協(xié)議,它在高速數(shù)據(jù)交換的設(shè)備中扮演著關(guān)鍵角色。
SPI可以通過(guò)軟件模擬和硬件外設(shè)資源實(shí)現(xiàn),軟件模擬SPI是指在不用硬件電路SPI控制器的情況下,通過(guò)通用輸入輸出引腳(GPIO)和程序代碼來(lái)模擬SPI通信時(shí)序的方法。我將通過(guò)這種方式來(lái)點(diǎn)亮官方配置的這一塊1.77寸TFT屏幕,讓屏幕顯示出圖片。
實(shí)現(xiàn)思路
使用普通的GPIO引腳分別模擬SCLK、MOSI、MISO、CS功能
通過(guò)程序控制引腳電平變化來(lái)生成SPI時(shí)序
用延時(shí)函數(shù)或精確計(jì)時(shí)控制通信時(shí)序
代碼實(shí)現(xiàn)
#if !defined(__SPI_H__) #define __SPI_H__ #include "cw32l012_sysctrl.h" #include "cw32l012_gpio.h" #include "cw32l012_spi.h" #include "cw32l012_systick.h" void SPI1_Init(void); uint8_t SPI_SwapByte(uint8_t byte); #define SPI_W_CS(x) GPIO_WritePin(CW_GPIOB, GPIO_PIN_5, (GPIO_PinState)x) #define SPI_W_CLK(x) GPIO_WritePin(CW_GPIOB, GPIO_PIN_6, (GPIO_PinState)x) #define SPI_W_MOSI(x) GPIO_WritePin(CW_GPIOB, GPIO_PIN_7, (GPIO_PinState)x) #define SPI_R_MISO() GPIO_ReadPin(CW_GPIOA, GPIO_PIN_6) #define SPI_W_RTS(x) GPIO_WritePin(CW_GPIOA,GPIO_PIN_15, (GPIO_PinState)x) #define SPI_W_DC(x) GPIO_WritePin(CW_GPIOB,GPIO_PIN_4, (GPIO_PinState)x) #endif // __SPI_H__
#include "SPI.h"
void SPI1_Init(void)
{
SYSCTRL_AHBPeriphClk_Enable(SYSCTRL_AHB_PERIPH_GPIOA|SYSCTRL_AHB_PERIPH_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pins = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pins = GPIO_PIN_6;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
GPIO_WritePin(CW_GPIOB, GPIO_PIN_6, GPIO_Pin_RESET);
GPIO_WritePin(CW_GPIOB, GPIO_PIN_5, GPIO_Pin_SET);
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pins = GPIO_PIN_15;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
}
uint8_t SPI_SwapByte(uint8_t byte)
{
uint8_t read_byte = 0x00;
for (uint8_t i = 0; i < 8; i++)
{
if (byte & 0x80)
{
SPI_W_MOSI(1);
}
else
{
SPI_W_MOSI(0);
}
byte <= 1;
SPI_W_CLK(1);
read_byte <= 1;
if ((uint8_t)SPI_R_MISO())
{
read_byte |= 0x01;
}
SPI_W_CLK(0);
}
return read_byte;
}
這就是軟件模擬SPI的底層驅(qū)動(dòng),由于屏幕顯示圖片的代碼數(shù)量太長(zhǎng)了,這里就沒(méi)有分享出來(lái)了;
軟件模擬SPI的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
靈活性高:可以在任何有GPIO的設(shè)備上實(shí)現(xiàn)
引腳可配置:可以任意選擇可用的GPIO引腳
多設(shè)備支持:可以輕松創(chuàng)建多個(gè)SPI總線實(shí)例
調(diào)試方便:可以添加調(diào)試信息和時(shí)序監(jiān)控
成本低:不需要專門的硬件SPI控制器
缺點(diǎn)
速度較慢:受限于CPU速度和軟件延時(shí)精度
CPU占用高:通信期間CPU需要持續(xù)處理時(shí)序
時(shí)序精度差:受中斷和其他任務(wù)影響,時(shí)序可能不穩(wěn)定
實(shí)時(shí)性差:不適合高速或?qū)崟r(shí)性要求高的應(yīng)用
實(shí)現(xiàn)復(fù)雜:需要仔細(xì)處理各種SPI模式和時(shí)序
實(shí)現(xiàn)效果

傳輸速度測(cè)試
這次對(duì)于SPI的實(shí)驗(yàn)做到這里其實(shí)基本算已經(jīng)完成了,但是每次寫通訊協(xié)議的代碼的時(shí)候,我都希望把每種通訊協(xié)議的性能拉滿,然后看看具體能達(dá)到多少速度,這次正好寫了SPI通訊的文章,出于對(duì)軟件模擬SPI通訊協(xié)議速度的好奇,那么我就想在這里測(cè)一測(cè)我這個(gè)實(shí)驗(yàn)的通訊協(xié)議的速度;
這顆芯片的官方手冊(cè)說(shuō)明了內(nèi)部集成 3個(gè)串行外設(shè)接口(SPI), 主機(jī)模式下 SCK 頻率高達(dá) 24MHz,理論上最大的傳輸速度是24Mbit/s,實(shí)際的傳輸速度是遠(yuǎn)遠(yuǎn)低于這個(gè)傳輸速度的,因?yàn)槌晒Πl(fā)送一個(gè)字節(jié)數(shù)據(jù)有協(xié)議開(kāi)銷,處理器和軟件開(kāi)銷。這是硬件SPI支持的最大數(shù)據(jù)傳輸速度,大家可以從我的底層代碼可以看到,MCU內(nèi)核對(duì)于代碼的執(zhí)行我是沒(méi)有添加任何的延時(shí)阻塞的,我在main.c中把時(shí)鐘的也配置到了這顆芯片最大的時(shí)鐘頻率96MHz,那么這顆芯片處理SPI底層代碼,也就是發(fā)送一個(gè)字節(jié)的數(shù)據(jù)是按照最大速度執(zhí)行的,然后我找來(lái)了示波器。
我們來(lái)看看示波器測(cè)試的結(jié)果:

黃色的線是SCLK的波形,藍(lán)色是MOSI信號(hào)線的波形

通過(guò)示波器的光標(biāo)我們可以看到發(fā)送一個(gè)字節(jié)需要的時(shí)間是18.6us,發(fā)送一位需要的時(shí)間就是18.6us/8=2.325us,那么1s發(fā)送的位數(shù)為:1s/2.325us=430107.5268,約等于430.107Kbit/s。即使去掉MCU內(nèi)核去處理其他代碼的時(shí)間,黃色的線間距較寬的地方就是內(nèi)核去處理其他代碼的時(shí)候,那么發(fā)送8個(gè)bit位用時(shí)14us,發(fā)送一位需要的時(shí)間就是14us/8=1.75us,1s發(fā)送的數(shù)據(jù)位是1s/1.75us=571428.5714,約等于571.428Kbit/s;
審核編輯 黃宇
-
開(kāi)發(fā)評(píng)估板
+關(guān)注
關(guān)注
0文章
2瀏覽量
702
發(fā)布評(píng)論請(qǐng)先 登錄
CW32L012與STM32G431的CORDIC三角函數(shù)運(yùn)算性能對(duì)比
CW32L012與STM32F103的三角運(yùn)算性能對(duì)比
基于芯源CW32 MCU的LED閃爍示例及代碼分析
基于武漢芯源CW32F030C8T6直流無(wú)刷電機(jī)評(píng)估開(kāi)發(fā)板的設(shè)計(jì)方案
CW32L012小型機(jī)器人控制評(píng)估板活動(dòng) 四足機(jī)器人+智能小車 開(kāi)箱評(píng)測(cè)
**CW32L012****開(kāi)發(fā)評(píng)估板的第一個(gè)程序**
CW32L012小機(jī)器人的電機(jī)控制
【活動(dòng)評(píng)測(cè)】基于CW32的wegui實(shí)驗(yàn)+代碼
CW32L011電機(jī)驅(qū)動(dòng)開(kāi)發(fā)板——驅(qū)動(dòng)無(wú)刷電機(jī)
堅(jiān)持繼續(xù)布局32位MCU,進(jìn)一步完善產(chǎn)品陣容,96Mhz主頻CW32L012新品發(fā)布!
武漢芯源半導(dǎo)體CW32L010在兩輪車儀表的應(yīng)用介紹
代碼+案例+生態(tài):武漢芯源半導(dǎo)體CW32嵌入式開(kāi)發(fā)實(shí)戰(zhàn)正式出版
使用芯源CW32的CW32L012開(kāi)發(fā)評(píng)估板做了spi屏幕驅(qū)動(dòng)
評(píng)論