用示波器觀察spi的cs和sck,發(fā)現(xiàn)cs下降沿到sck第一個下降沿間的時間約有50us,
嘗試修改過時鐘速率(60M/30M/15M等),CS0或者CS1、ActiveCS RW delay、Deactive CS RW delay都沒有直接影響 ,
這個50us的時間間隙對傳輸速率影響較大,想確定一下是芯片本身就是如何還是說在使用CH347T上位機Demo軟件設(shè)置的問題?
用示波器觀察spi的cs和sck,發(fā)現(xiàn)cs下降沿到sck第一個下降沿間的時間約有50us,
嘗試修改過時鐘速率(60M/30M/15M等),CS0或者CS1、ActiveCS RW delay、Deactive CS RW delay都沒有直接影響 ,
這個50us的時間間隙對傳輸速率影響較大,想確定一下是芯片本身就是如何還是說在使用CH347T上位機Demo軟件設(shè)置的問題?
您好,如上間隔時間為通過單獨的片選函數(shù)手動拉片選產(chǎn)生的延遲時間,芯片同時支持硬件SPI自動拉片選的操作。使用硬件SPI控制片選時間精度可控制在5us以內(nèi)。
假設(shè)當前spi時鐘為60MHz,以傳輸512Byte為例,其傳輸時間約為65us,而這個cs跟sck的間隔都有50us,
即512Byte實際使用了至少 115us,這使得實際有效傳輸效率降低了幾乎一半呀~~~~
對此,該有什么辦法可以提高傳輸效率嗎?
1、增大傳輸包數(shù)量?
2、不使用CS?
3、SPI轉(zhuǎn)usb的極限最大傳輸速率(理想情況下),有測過嗎?
謝謝
您好,如上信息已更正,參見#2,使用硬件SPI接口訪問可以達到較高的效率,如下所示:
你說的“通過單獨的片選函數(shù)手動拉片選產(chǎn)生的延遲時間”是指用CH347SPI_SetChipSelect函數(shù)嗎?
在demo工程里其僅僅在CH347DLL.H有定義,但實際并沒有調(diào)用過該函數(shù)哦。
上述測出的50us是直接用CH347Demo.exe測出的哦,是哪里配置錯了嗎?
? 藍色CS?黃色SCK,?不但前面有約50us時間間隔,后面還有約80us的時間間隔。
您好,可以添加我們技術(shù)支持微信,協(xié)助您看下代碼上的使用問題。方式已私信。
你好,我也碰到一模一樣的問題,沁恒官方能不能給個方案公布出來。不要老是解決方案說到一半,藏著掖著。有意義嗎。。。
產(chǎn)品用的好,大家會多使用的。。。。
您好,如上間隔時間為通過單獨的片選函數(shù)手動拉片選產(chǎn)生的延遲時間,芯片同時支持硬件SPI自動拉片選的操作。使用硬件SPI控制片選時間精度可控制在5us以內(nèi)。
無法解決嗎?是這樣的,read的延遲很久,但是write卻很快
CH347T/F 的SPI片選機制支持芯片自己控制片選以及上位機單獨控制片選,兩種方式。
如測試中遇到收發(fā)速率不夠快,應(yīng)該是因為使用的API函數(shù)使用了上位機片選的控制方式。您可使用接口函數(shù):CH347SPI_WriteRead?
,參數(shù)?ignoreCS?設(shè)置為false,在SPI模式0下看下速度。正常如:30MHz時鐘,正??梢赃_到2.5MB↑。
注:CH347SPI_WriteRead? 因底層會采用自動片選控制方式,其收發(fā)效率最優(yōu)。范例:
注:以下 SPI 設(shè)置 Clock 時鐘為 30MHz,MOSI 和 MISO 短接回環(huán)測速。
bool CH347_SPI_Init()
{
? ? bool ret;
? ? mSpiCfgS SpiCfg = { 0 };
? ? /* set spi interface in [mode3] & [30MHz] & [MSB] & output [0xFF] by default */
? ? SpiCfg.iMode = 0x03;
? ? SpiCfg.iByteOrder = 1;
? ? SpiCfg.iSpiOutDefaultData = 0xFF;
? ? SpiCfg.iChipSelect = 0x80;
? ? CH347SPI_SetFrequency(ch347device.fd, 30e6);
? ? /* set spi to 16bits transfer */
? ? CH347SPI_SetDataBits(ch347device.fd, 0);
? ? /* init spi interface */
? ? ret = CH347SPI_Init(ch347device.fd, &SpiCfg);
? ? if (!ret) {
? ? ? ? printf("Failed to init SPI interface.\n");
? ? ? ? return false;
? ? } else {
? ? ? ? printf("SPI Init ok.\n");
? ? }
? ? return true;
}
void ch347_spi__pressure_test()
{
? ? bool ret = false;
? ? int len;
? ? int i;
? ? uint8_t tBuffer[0x1000] = { 0 };
? ? uint8_t rBuffer[0x1000] = { 0 };
? ? int count = 0;
? ? ret = CH347_SPI_Init();
? ? if (ret == false) {
? ? ? ? printf("Failed to init CH347 SPI interface.\n");
? ? ? ? return;
? ? }
? ? printf("CH347 SPI interface init succeed.\n");
retry:
? ? len = 4000;
? ? ret = CH347SPI_WriteRead(ch347device.fd, false, 0x80, len, rBuffer);
? ? if (ret == false) {
? ? ? ? printf("Failed to CH347SPI_WriteRead.\n");
? ? ? ? return;
? ? }
? ? // 以下判斷為 SPI Loopback 模式下,SPI發(fā)送數(shù)據(jù)接收回來進行比對。
? ? if (memcmp(tBuffer, rBuffer, len)) {
? ? ? ? printf("SPI data comare error!!! (len = %d)\n\n", len);
? ? ? ? printf("TX data:\n");
? ? ? ? for (i = 0; i < len; i++) {
? ? ? ? ? ? printf("0x%2x ", tBuffer[i]);
? ? ? ? }
? ? ? ? printf("\n");
? ? ? ? printf("RX data:\n");
? ? ? ? for (i = 0; i < len; i++) {
? ? ? ? ? ? printf("0x%2x ", rBuffer[i]);
? ? ? ? }
? ? ? ? printf("\n");
? ? ? ? return;
? ? } else {
? ? ? ? printf("spi loopback ok (len = %d), count: %d\n", len, count);
? ? ? ? g_bytes_read += len;
? ? }