spi寫沒問題,spi讀不通

發布於 2022-12-11 11:31:38
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];
}

查看更多

關注者
0
被浏覽
1.3k
2 個回答
188****5088
188****5088 2022-12-11
這家夥很懶,什麼也沒寫!

(補充)軟片選部分

/*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");
               
}
isme
isme 認證專家 2022-12-11
冰鎮大西瓜

把這裡配置關掉,底層初始化過,你再初始化就會出現異常。
image.png

撰寫答案

請登錄後再發布答案,點擊登錄

發布
問題

分享
好友

手機
浏覽

掃碼手機浏覽