為什么在調(diào)用CH551G的SPI時,會在SCK前面出一個低電平?
而且需要后插3個nop才能保證SCK輸出時鐘數(shù)量和電平的正常?
以下是C代碼和用SDCC編譯后的匯編:
(用論壇自帶的插入代碼功能總會把半角空格變成問號,只好打個zip提交上來。字符集編碼為UTF-8)
為什么在調(diào)用CH551G的SPI時,會在SCK前面出一個低電平?
而且需要后插3個nop才能保證SCK輸出時鐘數(shù)量和電平的正常?
以下是C代碼和用SDCC編譯后的匯編:
(用論壇自帶的插入代碼功能總會把半角空格變成問號,只好打個zip提交上來。字符集編碼為UTF-8)
您好,
建議先測試單一SPI外設(shè)是否存在問題,檢查該SCK引腳是否存在與其他功能復(fù)用,硬件處理上,檢查該腳是否和其他器件相關(guān)。
C代碼就只有這些,沒有其他代碼
使用的只有SPI外設(shè)
SCK引腳沒有與其他功能復(fù)用
硬件只有一個CH551G,引腳輸出直接接的示波器探頭
well your code is very strange
check the clock programming i would do something like
CLOCK_CFG = (CLOCK_CFG & ~MASK_SYS_CK_SEL) | 0x06;
for sending spi data:
while (!S0_FREE)?
{
? ; /* wait till free */
}
SPI0_DATA? ? =? 0xAA;
摸索出解決辦法了,但是為什么這樣能解決?
先設(shè)置IO模式
? ? P1_MOD_OC? ? = 0x00 ;
? ? P1_DIR_PU? ? = 0xFF ;
? ? P3_MOD_OC? ? = 0x00 ;
? ? P3_DIR_PU? ? = 0xFF ;
再開啟并設(shè)置SPI0外設(shè)
? ? SPI0_CK_SE? ?= 0x02 ;
? ? SPI0_CTRL? ? = 0x68 ;
即使是給GPIO先置全1,也還會在SCK前面出一個低電平,出錯。
先開啟并設(shè)置SPI0外設(shè)
? ? SPI0_CK_SE? ?= 0x02 ;
? ? SPI0_CTRL? ? = 0x68 ;
再設(shè)置IO模式
? ? P1_MOD_OC? ? = 0x00 ;
? ? P1_DIR_PU? ? = 0xFF ;
? ? P3_MOD_OC? ? = 0x00 ;
? ? P3_DIR_PU? ? = 0xFF ;
就不會在SCK前面出一個低電平,完全正常。
需要后插3個nop才能保證SCK輸出時鐘數(shù)量和電平的問題使用發(fā)送完成檢測解決。
但是為什么先開啟并設(shè)置SPI0外設(shè),再設(shè)置IO模式,就能解決這個問題?
但是為什么先開啟并設(shè)置SPI0外設(shè),再設(shè)置IO模式,就能解決這個問題?
但是為什么先開啟并設(shè)置SPI0外設(shè),再設(shè)置IO模式,就能解決這個問題?
(重要的事說三遍)
不妨貼一下你現(xiàn)在完整的代碼工程。
最初的壓縮包里的代碼工程就是全部,僅僅只是修改了這些代碼的順序
確認是老版本PlatformIO自帶的SDCC版本有問題,更新到最新的PlatformIO和最新的SDCC后,再編譯工程,頂樓的代碼即使更換代碼順序后也會發(fā)生同樣的問題。
使用最新的PlatformIO和最新的SDCC,先開啟并設(shè)置SPI0外設(shè),再設(shè)置IO模式。將后插3個nop,更換為while ( S0_FREE == 0 ) ;后,SPI0正常工作。