有关spi数据传输的问题

在数据传输过程中,单步调试执行了下面代码

sem_ret = R_OS_SemaphoreWait(&g_sem_rspi_end[channel], p_cfg->timeout_value);

由于在smart configuration中transfer timeout设置为0xFFFFFFFF,所以程序一直原地踏步,请问是否是数据传送失败导致程序原地踏步还是transfer timeout需要设置新的值?

有关spi数据传输,由于单片机是主机,我将ssl引脚用作普通IO口控制从机片选,这是否会造成spi数据传输错误?

  • 你在这个函数后面下断点试试,正常情况下,如果SPI配置的是主模式的话,应该不会停在这里。
    你可以自己手动控制SSL端口,这样不会有问题,但是配置SPI口时,不要选则SSL口功能,
  • 我一步步调试,设置的确实是主模式,ssl口我设置为普通gpio口而不是ssl功能,但是无论我怎样做,程序都会在
    sem_ret = R_OS_SemaphoreWait(&g_sem_rspi_end[channel], p_cfg->timeout_value)执行不下去,我单步调试到这个函数里面,我发现会执行R_OS_TaskSleep(1)然后一直nop,请问是什么原因呢?是哪里出了问题,我认为我spi的设置和连接没有问题。
  • 这段程序在哪里,好像不在驱动程序模块里,程序是死在control函数里吗?
  • 没错程序死在control里面,一直执行到rspi_master_transfer()函数里面的sem_ret = R_OS_SemaphoreWait(&g_sem_rspi_end[channel], p_cfg->timeout_value)就执行不下去了,我查看后发现程序死在R_OS_SemaphoreWait()函数里面的R_OS_TaskSleep(1)处。
  • 这个驱动的架构是,control函数会启动发送数据,然后等待信号量,主要发送工作在中断中处理,中断程序会在中断里发送数据,发送完后设置信号量,按理来说主的spi是不会等待任何事件的,只有从才会等待,目前这种情况,有两种可能,一个是control输入参数有问题,没有启动发送,另一种情况是中断程序有问题,可能由于其他什么原因没有进入中断。可以尝试修改发送数据的长度,用示波器看一下有没有输出波形,另外如果使用了操作系统的话,不要单步执行,要不可能影响系统同步,可以在函数结束后下段点试试。
  • 非常感谢工程师的意见,考虑到可能存在中断程序的问题,我把我程序中可能存在的其他中断都关闭了,结果程序能够正常运行到control之后。但这还有一个问题,我设置了IRQ2响应从系统的外部中断,我将R_INTC_Init()注释掉spi确实能够发送数据,但为什么IRQ的初始化会影响spi的传输,甚至影响了我串口打印数据(在R_INTC_Init()函数执行之后串口无法打印数据,而在这条代码执行之前可以),我的IRQ代码如下:
    intc_result = R_INTC_Init();
    result = R_INTC_RegistIntFunc(INTC_ID_IRQ_IRQ2, MyInterruptHandler);
    result = R_INTC_SetPriority(INTC_ID_IRQ_IRQ2, 15);
    result = R_INTC_Enable(INTC_ID_IRQ_IRQ2);
    请问是否是中断优先级设置存在问题,仅仅只是初始化为什么会对control函数的运行造成影响,是否还有我没考虑到的因素,我怎样才能在使用IRQ外部中断的同时不影响串口和spi的数据接收,希望工程师解答。
  • 这个R_INT_Init()函数在void resetprg (void)调用过了,这是整个中断控制器的初始化函数,再次调用可能会有问题,如果想使用IRQ中断的话,首先应该在smart configrator 里面把中断配置上,然后使用下面的过程初始化一下试试
    result = R_INTC_RegistIntFunc(INTC_ID_IRQ_IRQ2, MyInterruptHandler);
    result = R_INTC_SetPriority(INTC_ID_IRQ_IRQ2, 15);
    调用这个函数设置IRQ中断检测的类型 R_IRQ_SetSense( e_r_drv_irq_num_t irq_num, e_r_drv_irq_sense_t sense),R_IRQ_SetSense函数在generate/drivers/r_intc/src/lld/r_intc_lld_rza2m.c里面,根据程序的参数说明来使用这个函数
    result = R_INTC_Enable(INTC_ID_IRQ_IRQ2);
  • 非常感谢,但我遇到了新的问题,我的spi程序如下:
    1.smart configuration已经添加rspi0,并选中了RSPCK0,MOSI,MISO引脚
    2. sprintf(s_drv_name, "%s%s", DEVICE_INDENTIFIER, "rspi0");
    g_rspi_handle = open(s_drv_name, O_RDWR);
    send_buf [0] = 0x05;
    data_buf.send_size = 1;
    result = control(g_rspi_handle, CTL_RSPI_TRANSFER, &data_buf);
    上面的程序执行过后没有出现返回错误,但输出端没有任何波形的变化,用示波器测RSPCK端也没有测到时钟信号,请问我是不是缺少了使能spi的步骤,我是按照rspi文件里的函数进行的。
  • 看一下端口的配置是否正确。

    因为每个功能端口可以配置到不同的端口,看一下是否选择了正确的端口