ESM335x提供了1路4線制全雙工SPI接口,可設置的波特率從1.5KHz到48MHz,ESM335x(WEC7)標準的SPI驅動采用IO模式進行數據收發,在大數據量通訊時,IO模式傳輸速度較慢,并且會占用相當多的CPU資源,進而影響整個系統的運行效率。
為了滿足SPI大數據量傳輸的應用,我們對SPI的驅動進行了更新,升級后的SPI驅動程序通過DMA控制數據收發。經過對比測試,同樣的傳輸過程,當在IO模式下CPU占用率接近100%時,采用DMA方式傳輸的CPU占用率僅在10%左右。ESM335x SPI接口采用DMA傳輸方式的數據傳輸率可達到每秒2MBytes。
升級后的驅動與原來的驅動程序提供的用戶API函數接口完全相同,在應用程序中配置SPI參數時增加MCSPI_CHCONF_DMAR_ENABLE 和 MCSPI_CHCONF_DMAW_ENABLE宏定義即使能DMA傳輸,否則采用原來的IO方式時行數據傳輸。下面是示例代碼:
#include "stdafx.h"
#include "mcspi.h"
#define XCH_SIZE (0x2000)
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hSPI;
BOOL rc;
BYTE TxBuf[XCH_SIZE];
BYTE RxBuf[XCH_SIZE];
DWORD dwSpiConf;
DWORD dwSpiCount, dwWorldSize, dwWL;
DWORD i;
hSPI = SPIOpen( _T("SPI1:"));
if( hSPI == INVALID_HANDLE_VALUE )
goto cleanUp;
dwWL = 8;//8-bits SPI,有效的設置為4-bits至32-bits
dwSpiConf =
MCSP1_MODE0 |//SPI時序模式0
/* Enable DMA, Maximum buffer is 0x4000 Bytes */
MCSPI_CHCONF_DMAR_ENABLE | MCSPI_CHCONF_DMAW_ENABLE|
MCSPI_CHCONF_WL(dwWL);
rc = SPIConfig( hSPI, 8000000, dwSpiConf);//波特率8MHz
if( !rc )
goto cleanUp;
if( dwWL > 16 )
dwWorldSize = sizeof(UINT32);
else if(dwWL > 8 )
dwWorldSize = sizeof(UINT16);
else
dwWorldSize = sizeof(UINT8);
dwSpiCount = 2000;
for(i=0; i
{
TxBuf[i] = i;//初始化數據收發buffer
RxBuf[i] = 0;
}
dwSpiCount *= dwWorldSize;//傳輸的字節數
rc = SPIWriteRead( hSPI, TxBuf, RxBuf, dwSpiCount );
if( !rc )
{
//數據傳輸有錯,錯誤處理...
}
cleanUp:
if( hSPI != INVALID_HANDLE_VALUE )
{
SPIClose(hSPI);
}
return 0;
}
ESM335x SPI接口同樣支持4種標準的SPI通訊模式,下圖是ESM335x主芯片數據手冊中對SPI各個模式的定義說明。
此次驅動升級針對ESM335x和EM335x系列的WEC7工控主板,需要更新SPI驅動的用戶可與我們聯系升級。
-
嵌入式主板
+關注
關注
7文章
6097瀏覽量
36143
發布評論請先 登錄
STM32H7ZGT6使用SPI+DMA方式驅動屏幕,使用DMA方式會花屏,為什么?
龍芯中科榮獲2024年度信息技術應用創新工作委員會卓越貢獻成員單位
芯盛智能榮獲2024年信息技術應用創新工作委員會卓越貢獻成員單位
飛騰助力首屆教育信息技術應用創新大賽圓滿落幕
有方科技參編的信息技術團體標準發布
龍芯中科助力2024首屆教育信息技術應用創新大賽成功舉辦
AM335x和AMIC110 Sitara?處理器技術參考手冊

評論