OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1454|回复: 2

imx6ull,SPI如何实现多字节发送?

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2023-8-14
在线时间
6 小时
发表于 2023-8-14 12:45:32 | 显示全部楼层 |阅读模式
1金钱
我在学习裸机SPI时发现,如果只是对SPI进行一个字节的读写,用icm的芯片没问题
于是我换了一个SRAM芯片,型号23LC512,用ch341的spi读写测试没有问题
但是接到6ULL开发板上的时候,就会出现读出来的数有时候正确有时候不正确
然后再换linux下的SPI,读出来的数返回值都是FF,我试了用SPI测试工具,只要读写是一个字节就都是返回FF
只有同时发送两个字节或者多个字节,才有返回数
所以很是不解如何才能使用fifo 64*32的缓冲区?这在两个例子里都没有说到
我尝试过修改突发长度到31(32bit),然后再再txdata中写个4字节的数据,还是返回FFFFFFFF
求高手指点,应该怎么写这个才对

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2023-8-14
在线时间
6 小时
 楼主| 发表于 2023-8-17 11:57:52 | 显示全部楼层
void spi_writeread(unsigned char * tx_buf, unsigned char * rx_buf, unsigned int len)
{
        u32 val;
        int i;
       
        val = readl(statreg);
        printk("statreg is %x.\r\n", val);

        if (len>512) len=512;
        val = readl(conreg);
        val &= 0x000FFFFF;
        val |= ((len * 8 - 1) << 20);
        writel(val, conreg);
       
        i=0;
        while(i<len)
        {
                switch((len - i)%4)
                {
                        case 1:
                                while((readl(statreg) & (1 << 0))==0){}
                                writel(tx_buf[i], txdata);
                                while((readl(statreg) & (1 << 3))==0){}
                                rx_buf[i] = readl(rxdata);
                                i++;
                                break;
                        case 2:
                                while((readl(statreg) & (1 << 0))==0){}
                                writel(tx_buf[i]*256 + tx_buf[i+1], txdata);
                                while((readl(statreg) & (1 << 3))==0){}
                                val = readl(rxdata);
                                rx_buf[i] = val >> 8;
                                rx_buf[i+1] = val & 0xFF;
                                i+=2;
                                break;
                        case 3:
                                while((readl(statreg) & (1 << 0))==0){}
                                writel(tx_buf[i]*65536 + tx_buf[i+1]*256 + tx_buf[i+2], txdata);
                                while((readl(statreg) & (1 << 3))==0){}
                                val = readl(rxdata);
                                rx_buf[i] = val >> 16;
                                rx_buf[i+1] = (val >> 8) & 0xFF;
                                rx_buf[i+2] = val & 0xFF;
                                i+=3;
                                break;
                        default:
                                while((readl(statreg) & (1 << 0))==0){}
                                writel((tx_buf[i]<<24) | (tx_buf[i+1]<<16) | (tx_buf[i+2]<<8) | tx_buf[i+3], txdata);
                                while((readl(statreg) & (1 << 3))==0){}
                                val = readl(rxdata);
                                rx_buf[i] = val >> 24;
                                rx_buf[i+1] = (val >> 16) & 0xFF;
                                rx_buf[i+2] = (val >> 8) & 0xFF;
                                rx_buf[i+3] = val & 0xFF;
                                i+=4;
                                break;
                };
        };
        printk("spi send: ");
        i=0;
        while(i<len)
        {
                printk("%X ",tx_buf[i]);
                i++;
        }
        printk("\r\n");

        printk("spi receive: ");
        i=0;
        while(i<len)
        {
                printk("%X ",rx_buf[i]);
                i++;
        }
        printk("\r\n");
}
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2023-8-14
在线时间
6 小时
 楼主| 发表于 2023-8-18 17:44:13 | 显示全部楼层
因为这个不解,索性买了个正点原子的逻辑分析仪,最后发现,如果是按照32bit发送,两个数据包之间的间隔是3416ns,而时钟的高低电平大多都是84ns,有些时80ns,不知道如果按照8bit发送,两帧之间的间隔应该是多少……实在是懒得测试了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 01:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表