void CH392_Port_Init(void)
{
//step00 config spi default and init @ sys/wm_main.c
/*調用傳參設置是否全雙向、設置主從,設置軟硬片選;(可以注釋掉,board.init的時候已經調用過)*/
// #if (TLS_CONFIG_LS_SPI)
// // tls_spi_init(); //demo中並沒有調用這部分,不應該重複調用這函數會與本該在board_init的函數沖突,會擾亂配置。
// #endif
//但是我現在需要用到軟片選.不過看來屏蔽它也可以。
////step01 config gpio ,MASTER SPI configuratioin
//wm_spi_cs_config(CH392_GPIO_CS_PIN); //硬件spi的cs
wm_spi_ck_config(CH392_GPIO_CK_PIN); //ck
wm_spi_di_config(CH392_GPIO_MI_PIN); //mi
wm_spi_do_config(CH392_GPIO_MO_PIN); //mo
tls_spi_trans_type(0); //帧length:0=byte transfer, 1=word transfer, 2=dma
tls_spi_setup( TLS_SPI_MODE_0, TLS_SPI_CS_LOW, 1000000 ); //spi mode(空閑時clk狀態、采樣邊沿奇偶),軟片選1/0設定,外設時鐘(clk=4M,主機通信支持MAX=20M從機支持MAX=8M)
printf("\r\n");
printf("CH392 Port Init ck--PB24, di--PB25, do--PB26;\r\n");
}
u8 SPI1_MasterRecvByte(void)
{
SPI1_MasterTransByte(0x0f);
u8 SPI1_DATA_LEN=1;
u8 retry1=0;
u8 eaval0=0;////u8 szval[4]={0,0,0,0};
tls_os_time_delay(1);//delay 2ms(有無更好的辦法) ////delay_us(10); //手冊說讀寫間隔和寫命令和數據間隔需要至少有1ms,而且還能避免執行太快導致阻塞讀寫不起作用,不對啊不用等阻塞啊阻塞只是判斷是否空閑但是不知道是否有應答開始啊(邏輯分析儀抓的是ch392回傳信號不僅跟總線空閑有關更跟外設處理速度有關 空閑讀沒處理完也讀不到啊。。)
//編寫阻塞讀取狀態寄存器判斷是否忙碌
while(spi_get_busy_status())
{
retry1++;
if(retry1>50)
{
printf("read timeout");
return 0;
}
}
eaval0=master_spi_recv_data_ch392(SPI1_DATA_LEN);//return SPI1_WriteRead(0x00);
return eaval0;
} //原廠讀函數寫再讀是為了激活clk
u8 master_spi_recv_data_ch392(u8 SPI1_DATA_LEN)
{
char *rx_buf = NULL;
rx_buf = tls_mem_alloc(SPI1_DATA_LEN);//申請堆
if (NULL == rx_buf)//驗證堆申請成功
{
printf("\nspi_demo rx mem err\n");
return WM_FAILED;
}
memset(rx_buf, 0, SPI1_DATA_LEN);
tls_spi_read((u8 *)rx_buf, SPI1_DATA_LEN);//硬件spi數據交換完成後,接收在rx_fifo的數據會存放在此堆裡?
printf("rx_buf[0] : %2x rx_buf[1]: %2x rx_buf_firstADDR:%2x\r\n,",rx_buf[0],rx_buf[1],rx_buf);
tls_mem_free(rx_buf);//釋放堆
// return WM_SUCCESS;
return (u8)rx_buf[0];
}
(補充)軟片選部分
/*pin封裝*/
#define CH392_GPIO_CS_PIN WM_IO_PB_23
#define CH392_GPIO_CK_PIN WM_IO_PB_24
#define CH392_GPIO_MI_PIN WM_IO_PB_25
#define CH392_GPIO_MO_PIN WM_IO_PB_26
#define CH392_GPIO_SS_PIN WM_IO_PB_21
//#define CSL tls_gpio_write(CH392_GPIO_CS_PIN,0);/* CS=0;*/
//#define CSH tls_gpio_write(CH392_GPIO_CS_PIN,1);/*CS=1 ;*/
#define CSL tls_gpio_write(CH392_GPIO_SS_PIN,0);/* CS=0;*/
#define CSH tls_gpio_write(CH392_GPIO_SS_PIN,1);/*CS=1 ;*/
#define xCH392CmdStart( ) CSL /* 命令開始 (片選使能)*/
#define xEndCH392Cmd( ) CSH /* 命令結束(脫機)*/
void Gpio_Init(void)
{
/*wm怎麼就只是配置了指定IO 的輸出模式,外設時鐘引腳時鐘都不配。*/
tls_gpio_cfg(CH392_GPIO_SS_PIN, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLHIGH);//軟件spi的cs直接寫gpio口_PB21(這裡沒有把各個變量怼成個結構體賦值好再傳去初始化,而是直接傳)
printf("Needed Gpio_Init PB21--SS\r\n");
}
還是不行 沒啥變化 讀到全是0
@18819865088 該屏蔽的spi_init屏蔽了,抓出來的時序與外設給的參考完全對上了
@18819865088 建議你先把spi的demo跑通再去改代碼。
這裡一定一定要屏蔽掉,用命令行編譯一定要make lib再make
@isme demo我看過。我這邊代碼還修改了一些系統底層的接口函數,我認為基本是沒問題的。
現在加入dma方式可以完全讀寫了.