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 方式可以完全读写了.