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
被浏览
2. 1k
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

撰写答案

请登录后再发布答案, 点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览