3049
- 收藏
- 点赞
- 分享
- 举报
Hi3531DV200 SPI有人调通吗
目前我在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 ;
}
//管脚复用
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 ;
}
我来回答
回答3个
时间排序
认可量排序
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2021-05-21 11:30:08
-
2022-04-23 14:19:00
-
2020-05-13 14:22:45
-
2021-08-21 13:04:24
-
2022-10-28 13:23:37
-
2020-02-25 15:26:45
-
2023-01-31 13:53:28
-
2022-02-14 17:24:10
-
2022-08-20 13:52:41
-
2023-06-26 16:11:04
-
2023-01-05 16:46:20
-
2020-02-25 15:34:17
-
2020-05-14 13:38:39
-
2020-05-26 09:22:26
-
2022-10-13 11:08:05
-
2022-03-01 11:23:14
-
2020-11-05 10:49:31
-
2021-07-28 17:41:38
-
2021-04-10 20:20:18
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
10RV1106的低功耗和休眠唤醒功能
-
10海思平台(Hi3516DV500),设置完ldc参数后 工作异常
-
5rv1126-dc-201 安装hi3881.ko wifi驱动成功后 启动connmand服务,系统就崩了
-
10ss928编码的h264帧流,用RTSP传输到电脑,VLC播放不了是什么情况?
-
10我运行rv1126的开发环境后,编译demo提示没有opencv,自行编译安装后没有解决,请问这个怎么处理呢?板子是easy eai nano
-
50CPS-1848 link不上FPGA。
-
10想问一下各位大佬们,关于VI配置成8Lan LVDS模式的相关问题
-
10基于SS928的NNIE做人脸检测算法,模型转换异常
-
10RV1126 38板有imx415的镜像吗?
-
5海思3519dv500 LT9611配置设备树问题
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认