导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    【T113-I】 请问该产品支持spi传输32bit数据吗

    T Series
    3
    14
    2267
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • W
      wayneyao LV 4 最后由 wayneyao 编辑

      您好,尊敬的大佬们,由于我选用的spi外设是32bit传输的,所以应外设的需求,我根据T113的数据手册去设置BATC寄存器,还有更改了spi-sunxi.c中的 master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(32);
      但是通过逻辑分析仪,甚至无法出现数据。以下是我通过截取spi寄存器的数值图:
      9226346b-a753-462a-8e5b-ae38aa8e67ce-7257463f35dc024e00018369f18442a.png
      所以我有以下三个疑问:
      1:T113-i这款芯片 硬件上支持spi传输32bit吗?
      2:若支持,请问我这样配置是否有误?
      3:若不支持,请问我是否能够通过spi-gpio模拟出读写32bit的spi
      非常希望得到大佬们的点拨😳

      1 条回复 最后回复 回复 引用 分享 1
      • W
        wayneyao LV 4 最后由 编辑

        其次我看数据手册和spi-sunxi.h中 寄存器的地址定义不同,此外数据手册是否缺少了0x3c的寄存器定义
        23d381d6-67cb-49f5-bc7e-4cc2a6d3926f-image.png
        633d0a13-07bc-4868-b767-9dfe5f11714d-image.png

        A 1 条回复 最后回复 回复 引用 分享 1
        • A
          awwwwa LV 8 @wayneyao 最后由 awwwwa 编辑

          @wayneyao IP版本不同,驱动有修改,以手册为准,控制器支持32bit,请提供设备树和驱动修改

          W 2 条回复 最后回复 回复 引用 分享 2
          • W
            wayneyao LV 4 @awwwwa 最后由 awwwwa 编辑

            @awwwwa
            以下是我的设备树修改:

            &spi1 {
            	clock-frequency = <50000000>;
            	// pinctrl-0 = <&spi1_pins_a &spi1_pins_b>;
            	pinctrl-0 = <&spi1_pins_a>;
            	pinctrl-1 = <&spi1_pins_c>;
            	pinctrl-names = "default", "sleep";
            	spi_slave_mode = <0>;
            	spi1_cs_number = <1>;
                spi1_cs_bitmap = <1>;
            	status = "okay";
            	cs-gpios =<&pio PB 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
            	,<&pio PB 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
            	/*nWKRQ RST nINT SCLK SDI  SDO  NCS
            	  PD4	PD5	PD6	 PB11 PB10 PB9  PD10
            	  PD7   PD8 PD9  PB11 PB10 PB9  PD11					
            									*/
            	tcan4551_0:tcan4551@0{
                    #address-cells=<1>;
                    #size-cells=<1>;
                    compatible = "ti,tcan4x5x";
                    reg = <0>;
                    spi-max-frequency =<10000000>;
            		bosch,mram-cfg = <0x0 0 0 32 0 0 1 1>;
            		interrupt-parent = <&pio>;
            		interrupts = <DP 6 IRQ_TYPE_LEVEL_HIGH>;
            		device-wake-gpios = <&pio PD 4 GPIO_ACTIVE_HIGH>;
            		reset-gpios = <&pio PD 5 GPIO_ACTIVE_LOW>;
                };
            	tcan4551_2:tcan4552@0{
                    #address-cells=<1>;
                    #size-cells=<1>;
                    compatible = "ti,tcan4x5x";
                    reg = <0>;
                    spi-max-frequency =<10000000>;
            		bosch,mram-cfg = <0x0 0 0 32 0 0 1 1>;
            		interrupt-parent = <&pio>;
            		interrupts = <PD 9 IRQ_TYPE_LEVEL_HIGH>;
            		device-wake-gpios = <&pio PD 7 GPIO_ACTIVE_HIGH>;
            		reset-gpios = <&pio PD 8 GPIO_ACTIVE_LOW>;
                };
            	
            };
            
            	spi1_pins_a: spi1@0 {
            		pins = "PB11", "PB10", "PB9"; /*clk mosi miso hold wp*/
            		function = "spi1";
            		drive-strength = <10>;
            	};
            
            1 条回复 最后回复 回复 引用 分享 0
            • W
              wayneyao LV 4 @awwwwa 最后由 awwwwa 编辑

              @awwwwa
              spi-sunxi.h spi-sunxi.c
              以上是我稍作修改的spi-sunxi文件,
              主要是做了以下三个地方的修改:
              1:在.h文件当中将寄存器地址与t113的数据手册对齐:

              // #define SPI_BATC_REG (0x3C) /* Bit-Aligned transfer configure register */
              // #define SPI_BACC_REG (0x40) /* Bit-Aligned clock configure register */
              // #define SPI_TXBIT_REG (0x34) /* tx bit register */
              // #define SPI_RXBIT_REG (0x48) /* rx bit register */
              #define SPI_BATC_REG (0x40) /* Bit-Aligned transfer configure register */
              #define SPI_BACC_REG (0x44) /* Bit-Aligned clock configure register */
              #define SPI_TXBIT_REG (0x48) /* tx bit register */
              #define SPI_RXBIT_REG (0x4c) /* rx bit register */
              2:在spi初始化阶段执行spi_config_batc():
              static void spi_config_batc(u32 config, void __iomem *base_addr)
              {
              	u32 reg_val = readl(base_addr + SPI_BATC_REG);
              	// config &= ~SPI_BPW_MASK(8);
              	// if (config) {
              		reg_val |= 0x03;
              		// reg_val |=(0x1 <<  0);
              		// reg_val |=(0x1 <<  1);
              		//设置成32位一帧
              		reg_val |= (32 << 8);
              		reg_val |= (32 << 16);
              		reg_val |= (0x1 << 24);
              	// }
              
              	writel(reg_val, base_addr + SPI_BATC_REG);
              }
              

              3:在3033行对bits_per_word_mask 增加32bit的位掩码
              master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(32);
              非常感谢您的回复,以上便是我的全部修改,请问还有什么需要我去调整的地方吗

              J 1 条回复 最后回复 回复 引用 分享 0
              • J
                Jingyan LV 5 @wayneyao 最后由 编辑

                @wayneyao 使用bit-aligin模式可以支持1~32bpw,但旧驱动没有完善这部分功能,需要对照手册自行添加下

                W 1 条回复 最后回复 回复 引用 分享 0
                • W
                  wayneyao LV 4 @Jingyan 最后由 编辑

                  @jingyan :😂 您好 ,我已按照数据手册修改了bit-aligned相关部分寄存器BATC的值 0x40=0x012020a3,但仍未生效32bit传输,不知是否还需要配置其他寄存器,修改的部分在上面已上传。

                  J 1 条回复 最后回复 回复 引用 分享 0
                  • J
                    Jingyan LV 5 @wayneyao 最后由 Jingyan 编辑

                    @wayneyao 还需要给0x40[bit31]置1发起传输,然后向0x48写入32bit数据,等待0x40[bit25]置1完成传输后,从0x4C读出32bit数据。
                    另外bit模式不支持全双工,若tx/rx同时配置,会先发再收

                    W 2 条回复 最后回复 回复 引用 分享 0
                    • W
                      wayneyao LV 4 @Jingyan 最后由 编辑

                      @jingyan 😰 难度炸裂

                      1 条回复 最后回复 回复 引用 分享 0
                      • W
                        wayneyao LV 4 @Jingyan 最后由 编辑

                        @jingyan 您好请问 不支持全双工,是指只能用3线制才能实现bit-aligin传输吗 还是说四线制spi也支持bit-aligin传输 只是无法同时读写

                        J 1 条回复 最后回复 回复 引用 分享 0
                        • J
                          Jingyan LV 5 @wayneyao 最后由 编辑

                          @wayneyao 是的,无法同时读写。bit模式支持3线或标准4线,具体见0x40[1:0]配置

                          W 1 条回复 最后回复 回复 引用 分享 0
                          • W
                            wayneyao LV 4 @Jingyan 最后由 编辑

                            @jingyan 好的 感谢您的回复

                            1 条回复 最后回复 回复 引用 分享 0
                            • W
                              wayneyao LV 4 最后由 xiaowenge 编辑

                              SPI 可以通过组包的方式 发送4次8bit 组成一次32bit
                              //线传输地址,再传输要传送的值 线传输低位,再传输高位

                                  addr = TCAN4X5X_WRITE_CMD | (*((u16 *)reg) << 8) | val_len >> 2;
                                  txaddr[0] = (addr >> 24) & 0xff;
                                  txaddr[1] = (addr >> 16) & 0xff;
                                  txaddr[2] = (addr >> 8) & 0xff;
                                  txaddr[3] = (addr >> 0) & 0xff;
                                  txval[0] = (*(u32 *)val >> 24) & 0xff;
                                  txval[1] = (*(u32 *)val >> 16) & 0xff;
                                  txval[2] = (*(u32 *)val >> 8) & 0xff;
                                  txval[3] = (*(u32 *)val >> 0) & 0xff;
                                  struct spi_transfer t[8] = {
                                      {
                                          .tx_buf = &txaddr[0],
                                          .len = 1,
                                          .cs_change = 0,
                                      },
                                      {
                                          .tx_buf = &txaddr[1],
                                          .len = 1,
                                          .cs_change = 0,
                                      },
                                      {
                                          .tx_buf = &txaddr[2],
                                          .len = 1,
                                          .cs_change = 0,
                                      },
                                      {
                                          .tx_buf = &txaddr[3],
                                          .len = 1,
                                          .cs_change = 0,
                                      },
                                      {
                                          .tx_buf = &txval[0],
                                          .len = 1,
                                          .cs_change = 0,
                                      },
                                      {
                                          .tx_buf = &txval[1],
                                          .len = 1,
                                          .cs_change = 0,
                                      },
                                      {
                                          .tx_buf = &txval[2],
                                          .len = 1,
                                          .cs_change = 0,
                                      },
                                      {
                                          .tx_buf = &txval[3],
                                          .len = val_len,
                                      },
                                  };
                                  // printk("txbuf:%x %x %x %x %x\n", txaddr, txaddr[0], txaddr[1],
                                  //        txaddr[2], txaddr[3]);
                                  // printk("txval:%x %x %x %x %x\n", *(u32 *)val, txval[0], txval[1],
                                  //        txval[2], txval[3]);
                              
                                  spi_message_init(&m);
                                  spi_message_add_tail(&t[0], &m);
                                  spi_message_add_tail(&t[1], &m);
                                  spi_message_add_tail(&t[2], &m);
                                  spi_message_add_tail(&t[3], &m);
                                  spi_message_add_tail(&t[4], &m);
                                  spi_message_add_tail(&t[5], &m);
                                  spi_message_add_tail(&t[6], &m);
                                  spi_message_add_tail(&t[7], &m);
                              
                              J 1 条回复 最后回复 回复 引用 分享 0
                              • J
                                Jingyan LV 5 @wayneyao 最后由 编辑

                                @wayneyao 也是一种方法,但限制是bit要8的倍数才行

                                1 条回复 最后回复 回复 引用 分享 1
                                • Moved from 其它全志芯片讨论区 by  xiaowenge xiaowenge 
                                • 1 / 1
                                • First post
                                  Last post

                                Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                                行为准则 | 用户协议 | 隐私权政策