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