查看: 73|回复: 0

[求助] Hi3531DV200 SPI有人调通吗

[复制链接]
发表于 2021-2-20 11:22:35 | 显示全部楼层 |阅读模式
目前我在sys_config.c文件中将SPI的管脚复用与时钟修改了,打开SPI设备不能与GV7704通信,能帮忙看下哪里有问题吗

//管脚复用
static void spi_pin_mux(void)
{
    SYS_WRITEL(g_reg_iocfg_base + 0x010c, 0x1403); /* SPI_CSN0 */
    SYS_WRITEL(g_reg_iocfg_base + 0x0110, 0x1403); /* SPI_CSN1 */
    SYS_WRITEL(g_reg_iocfg_base + 0x0114, 0x1403); /* SPI_CSN2  */
    SYS_WRITEL(g_reg_iocfg_base + 0x0118, 0x1403); /* SPI_CSN3  */

    SYS_WRITEL(g_reg_iocfg_base + 0x011C, 0x1403); /* SPI_SDI */
    SYS_WRITEL(g_reg_iocfg_base + 0x0120, 0x1403); /* SPI_SDO */
    SYS_WRITEL(g_reg_iocfg_base + 0x0124, 0x1403); /* SPI_CLK */
}

//时钟
static void spi_clk_cfg_3531dv200(void)
{
SYS_WRITEL(g_reg_crg_base + 0x4480, 0x1);
SYS_WRITEL(g_reg_crg_base + 0x4480, 0x10);
}

//打开SPI设备
int app_per_spi_init(const char* device)
{
        int fd = -1;
        fd = open(device, O_RDWR);
        if(fd < 0)
        {
                printf("----open spidev failed!----\n");
                return -1;
        }
        int ret = 0;
        ret = ioctl(fd, SPI_IOC_WR_MODE, &spi_mode);
    if(ret == -1)
        {
                printf("set spi WR mode error\n");
                return -1;
    }

    ret = ioctl(fd, SPI_IOC_RD_MODE, &spi_mode);
    if(ret == -1)
        {
        printf("set spi RD mode error\n");
        return -1;
    }   

    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
    if(ret == -1)
        {
                printf("set spi write bits per word error\n");
                return -1;
    }

    ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
    if(ret == -1)
        {
                printf("set spi read bits per word error\n");
                return -1;
    }

    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
    if(ret == -1)
        {
                printf("set spi write Max speed error\n");
                return -1;
    }
   
    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
    if(ret == -1)
        {
                printf("set spi write Max speed error\n");
                return -1;
    }
        return fd;
}

void app_per_spi_sendData(int fd, unsigned char *ptrBuf, int bufLen)
{
        int i;
        int retval = 0;
        int mode = spi_mode;
       
        retval = ioctl(fd, SPI_IOC_WR_MODE, &mode);
        if (retval < 0)
        {
                printf("ioctl error \n");
                close(fd);
                return ;
        }
       
        struct spi_ioc_transfer mesg[1];
       
        unsigned char  buf[SSP_BUF_LEN];

        memset(mesg, 0, sizeof mesg);
       
//        mesg[0].rx_buf = (unsigned long)buf,
        mesg[0].tx_buf = (unsigned long)buf;
        mesg[0].len = bufLen;
        mesg[0].delay_usecs = delay;
        mesg[0].speed_hz = speed;
        mesg[0].bits_per_word = bits;
        mesg[0].cs_change = 1;

        memset(buf, 0, SSP_BUF_LEN);
       
        reverse8(buf, mesg[0].len);

        retval = ioctl(fd, SPI_IOC_MESSAGE(1), &mesg);
    if(retval != mesg[0].len)
        {
                printf("SPI_IOC_MESSAGE error \n");
        }
        return ;
}

void app_per_spi_recvData(int fd, unsigned char *ptrBuf, int bufLen)
{
        int i;
        int retval = 0;
        uint32_t mode = spi_mode;
        struct spi_ioc_transfer mesg[1];
       
        memset(mesg, 0, sizeof mesg);

        mesg[0].rx_buf = (unsigned long)ptrBuf,
//        mesg[0].tx_buf = (unsigned long)ptrBuf;
        mesg[0].len = bufLen;
        mesg[0].speed_hz = speed;
        mesg[0].delay_usecs = delay;
        mesg[0].bits_per_word = bits;
        mesg[0].cs_change = 1;

        retval = ioctl(fd, SPI_IOC_MESSAGE(1), &mesg);
    if(retval < 1)
        {
                printf("SPI_IOC_MESSAGE error \n");
        }
        return ;
}

您需要登录后才可以回帖 登录 | 注册

本版积分规则

© 2008-2017 当前位置 易百纳技术社区论坛 返回 易百纳技术社区 ( 苏ICP备14036084 )   Powered by Discuz! X3.1
快速回复 返回顶部 返回列表