请选择 进入手机版 | 继续访问电脑版
查看: 336|回复: 0

[分享] Freescale 之Flexbus总线读写SRAM

[复制链接]
  • TA的每日心情
    开心
    2022-4-14 11:08
  • 签到天数: 47 天

    [LV.5]常住居民I

    22

    主题

    104

    帖子

    0

    高级会员

    Rank: 4

    积分
    603
    最后登录
    2022-4-28
    发表于 2020-7-6 15:02:44 | 显示全部楼层 |阅读模式
    Freescale 之Flexbus总线读写SRAMFlexbus 是一种比较灵活的总线,本文将自己的学习心得做个总结。
    以官方TWR_MEM的原理图为例来分析:



    硬件连接如下:

    SRAM的真值表如下:

    关于硬件上的几点说明:

    1)SRAM的A0连接的是FB_AD1,为什么没有和FB_AD0相连接呢?为什么错开了一位?

    根本原因是因为SRAM的数据总线是16位导致的。

    2)这个设计的数据线的高八位是和低八位并连在一起的,只用了8根数据线。这样可以节省8条线。

    2)为什么将FB_A0连接到SRAM的UB(Upper byte select),它取反之后的FB_A0_B连接到SRAM的LB(Lower byte select)?

    原因是:ARM corte-M4芯片默认是小端存储模式,即低地址存放高字节数据,所以放FB_A0 为0时,访问的高字节数据,当FB_A0为1访问的是低地址数据。

    看完硬件,再来分析软件:

    1)打开Flexbus的Clock Gate,设置security level

    1. #define OFF_CHIP_ACCESS_ALLOW   3
    2.     SIM_MemMapPtr   sim = SIM_BASE_PTR;
    3.     /* Enable clock to FlexBus module */
    4.     sim->SCGC7 |= SIM_SCGC7_FLEXBUS_MASK;
    5.     sim->SOPT2 |= SIM_SOPT2_FBSL(OFF_CHIP_ACCESS_ALLOW); // Flexbus security level
    复制代码

    2)分配好地址线和数据线,控制线

    1. //  地址线  FB_AD1~FB_AD18连接SRAM的A0~A17
    2.     PORTD_PCR5 = PORT_PCR_MUX(5);  // FB_AD1
    3.     PORTD_PCR4 = PORT_PCR_MUX(5);  // FB_AD2
    4.     PORTD_PCR3 = PORT_PCR_MUX(5);  // FB_AD3
    5.     PORTD_PCR2 = PORT_PCR_MUX(5);  // FB_AD4
    6.     PORTC_PCR10 = PORT_PCR_MUX(5);  // FB_AD5
    7.     PORTC_PCR9 = PORT_PCR_MUX(5);   // FB_AD6
    8.     PORTC_PCR8 = PORT_PCR_MUX(5);   // FB_AD7
    9.     PORTC_PCR7 = PORT_PCR_MUX(5);   // FB_AD8
    10.     PORTC_PCR6 = PORT_PCR_MUX(5);   // FB_AD9
    11.     PORTC_PCR5 = PORT_PCR_MUX(5);   // FB_AD10
    12.     PORTC_PCR4 = PORT_PCR_MUX(5);   // FB_AD11
    13.     PORTC_PCR2 = PORT_PCR_MUX(5);   // FB_AD12
    14.     PORTC_PCR1 = PORT_PCR_MUX(5);   // FB_AD13
    15.     PORTC_PCR0 = PORT_PCR_MUX(5);   // FB_AD14
    16.     PORTB_PCR18 = PORT_PCR_MUX(5);  // FB_AD15   
    17.     PORTB_PCR17 = PORT_PCR_MUX(5);  // FB_AD16
    18.     PORTB_PCR16 = PORT_PCR_MUX(5);  // FB_AD17
    19.     PORTB_PCR11 = PORT_PCR_MUX(5);  // FB_AD18


    20.     // 数据线 FB_AD24~FB_AD31连接SRAM的低八位数据线DQL0~DQL7
    21.     PORTC_PCR15 = PORT_PCR_MUX(5);  // FB_AD24 used as DQL7
    22.     PORTC_PCR14 = PORT_PCR_MUX(5);  // FB_AD25 used as DQL6
    23.     PORTC_PCR13 = PORT_PCR_MUX(5);  // FB_AD26 used as DQL5
    24.     PORTC_PCR12 = PORT_PCR_MUX(5);  // FB_AD27 used as DQL4
    25.     PORTB_PCR23 = PORT_PCR_MUX(5);  // FB_AD28 used as DQL3
    26.     PORTB_PCR22 = PORT_PCR_MUX(5);  // FB_AD29 used as DQL2
    27.     PORTB_PCR21 = PORT_PCR_MUX(5);  // FB_AD30 used as DQL1
    28.     PORTB_PCR20 = PORT_PCR_MUX(5);  // FB_AD31 used as DQL0

    29.     // 控制线
    30.    // PORTC_PCR3 = PORT_PCR_MUX(5);   // CLKOUT , FB_CLK  optional
    31.     PORTD_PCR1 = PORT_PCR_MUX(5);  // FB_CS0_b  连接SRAM的 Chip enable端
    32.     PORTC_PCR11 = PORT_PCR_MUX(5);  // FB_RW_b  连接SRAM的 Write enable端
    33.     PORTB_PCR19 = PORT_PCR_MUX(5);  // FB_OE_b  连接SRAM的 Output enable端
    34.     PORTD_PCR6 = PORT_PCR_MUX(5);  // FB_AD0   连接SRAM的 Upper byte select端
    复制代码

    这里并没有使用PTC3/CLKOUT,因为操作SRAM不需要时钟。

    3)设置Flexbus相关的四个寄存器,FB_CSARn,FB_CSMRn,FB_CSCRn,FB_CSPMCR
    a).__先把FB_CSMR0的V位置1!!

    1. FB_CSMR0 |= FB_CSMR_V_MASK; // we must set V in FB_CSMRn, because it act as a global CS
    复制代码

    之后设置的寄存器中的 n取决于实际中用的是哪个CS
    b).__设置FB_CSARn中的BA

    1. // Chip select address resgister ,FB_CSARn
    2.     FB_CSAR0 = FLEX_BUS_BASE_ADDRESS; // Base Address
    复制代码

    FLEX_BUS_BASE_ADDRESS的值为:

    1. #define FLEX_BUS_BASE_ADDRESS  0x60000000
    复制代码

    c).__设置FB_CSMRn

    1.   // Chip select mask register, FB_CSMR0
    2.     FB_CSMR0 = FB_CSMR_V_MASK | FB_CSMR_BAM(0)  ;
    复制代码

    BAM=0x0000 表示0x6000_0000~0x6000_FFFF的64KB范围内都是有效
    BAM=0x0001,表示0x6000_0000~0x6001_FFFF的128KB范围内都是有效
    BAM=0x0003,表示0x6000_0000~0x6003_FFFF的256KB范围内都是有效
    BAM=0x0007,表示0x6000_0000~0x6007_FFFF的512Kb范围内都是有效
    BAM=0x0004,表示0x6000_0000~0x6000_FFFF和0x6004_0000~0x6004_FFFF这两个不连续的128KB的空间

    d).__设置FB_CSCRn

    1.   FB_CSCR0 =  FB_CSCR_PS(1)             /* Set port size  , 8-bit port*/
    2.                 | FB_CSCR_AA_MASK         /* auto-acknowledge(这位设置很重要,非阻塞,数据传输完成(或者等待n个
    3.                                                                waite states)自动终结时钟周期,如果FB_TA不被使能,该位必须置位。) */
    4.                // | FB_CSCR_BLS_MASK        /*  Data is left-aligned on FB_AD,一般就设置为0,这样地址和数据总线不复用  */
    5.                                             /*  8-bit port size ---FB_D[31:24]  ,16-bit port size--16-bit port size.          */


    6.                 | FB_CSCR_BEM_MASK         /* Byte-Enable Mode */


    7.                 | FB_CSCR_WS(0x2)         /* 2 wait state - may need more wait states depending on the bus speed     1 不行 */

    8.                 | FB_CSCR_ASET(0x1)       /* assert chip select on second clock edge after address is asserted
    9.                                                                - may be changed if need */

    10.                 | FB_CSCR_RDAH(0x0)

    11.                 | FB_CSCR_WRAH(0x0)   ;
    复制代码

    这里数据线是8bit,所以PS设置为1,BLS默认是左对齐,就是数据在高位。
    e).__设置FB_CSPMCR,这个根据实际使用的flexbus线来设置。
    1. // Chip select port multiplexing control register, 对于本demo可以不做设置,因为没有用到相关的线
    2.     FB_CSPMCR = FB_CSPMCR_GROUP1(1)      /* FB_CS1 */
    3.              | FB_CSPMCR_GROUP2(0)     /* FB_CS4 */
    4.              | FB_CSPMCR_GROUP3(0)     /* FB_CS5 */
    5.              | FB_CSPMCR_GROUP4(1)     /* FB_CS2 */
    6.              | FB_CSPMCR_GROUP5(1)  ;   /* FB_CS3 */
    复制代码

    之后就可以操作SRAM了
    程序里:*address = value,自动产生一定的时序,地址(映射到FB_AD0—FB_AD18)+数据(映射到FB_AD24-FB_AD31),这样就完成了对SRAM的写操作。其实不管程序里指针类型是什么,都可以自动的完成数据的读写。

    1. void main (void)
    2. {
    3. char * p = (char *)FLEX_BUS_BASE_ADDRESS;   printf("***********************************************\n");
    4.     printf("FLEX BUS test, you need to connect the \n");
    5.     printf("TWR-MEM board and add jumper at J15 and J10 \n");
    6.     printf("to test the code.\n");
    7.     printf("***********************************************\n");

    8.     flex_bus_init();

    9.     printf("write to SRAM on flex bus, 0x11, 0x22, 0x33, 0x44\n");
    10.     *p++ = 0x11;
    11.     *p++ = 0x22;
    12.     *p++ = 0x33;
    13.     *p++ = 0x44;

    14.     p = (char *)FLEX_BUS_BASE_ADDRESS;
    15.     printf("reading SRAM from flex bus: %x,%x,%x,%x\n", p[0],p[1],p[2],p[3]);
    16.     }
    复制代码
    再附上完整的初始化代码:
    1. void flex_bus_init(void)
    2. {
    3.     #define OFF_CHIP_ACCESS_ALLOW   3
    4.     SIM_MemMapPtr   sim = SIM_BASE_PTR;
    5.     /* Enable clock to FlexBus module */
    6.     sim->SCGC7 |= SIM_SCGC7_FLEXBUS_MASK;
    7.     sim->SOPT2 |= SIM_SOPT2_FBSL(OFF_CHIP_ACCESS_ALLOW); // Flexbus security level

    8.    //////////////////////////////////////////////////////////////////////////

    9.     //  地址线  FB_AD1~FB_AD18连接SRAM的A0~A17
    10.     PORTD_PCR5 = PORT_PCR_MUX(5);  // FB_AD1
    11.     PORTD_PCR4 = PORT_PCR_MUX(5);  // FB_AD2
    12.     PORTD_PCR3 = PORT_PCR_MUX(5);  // FB_AD3
    13.     PORTD_PCR2 = PORT_PCR_MUX(5);  // FB_AD4
    14.     PORTC_PCR10 = PORT_PCR_MUX(5);  // FB_AD5
    15.     PORTC_PCR9 = PORT_PCR_MUX(5);   // FB_AD6
    16.     PORTC_PCR8 = PORT_PCR_MUX(5);   // FB_AD7
    17.     PORTC_PCR7 = PORT_PCR_MUX(5);   // FB_AD8
    18.     PORTC_PCR6 = PORT_PCR_MUX(5);   // FB_AD9
    19.     PORTC_PCR5 = PORT_PCR_MUX(5);   // FB_AD10
    20.     PORTC_PCR4 = PORT_PCR_MUX(5);   // FB_AD11
    21.     PORTC_PCR2 = PORT_PCR_MUX(5);   // FB_AD12
    22.     PORTC_PCR1 = PORT_PCR_MUX(5);   // FB_AD13
    23.     PORTC_PCR0 = PORT_PCR_MUX(5);   // FB_AD14
    24.     PORTB_PCR18 = PORT_PCR_MUX(5);  // FB_AD15   
    25.     PORTB_PCR17 = PORT_PCR_MUX(5);  // FB_AD16
    26.     PORTB_PCR16 = PORT_PCR_MUX(5);  // FB_AD17
    27.     PORTB_PCR11 = PORT_PCR_MUX(5);  // FB_AD18


    28.     // 数据线 FB_AD24~FB_AD31连接SRAM的低八位数据线DQL0~DQL7
    29.     PORTC_PCR15 = PORT_PCR_MUX(5);  // FB_AD24 used as DQL7
    30.     PORTC_PCR14 = PORT_PCR_MUX(5);  // FB_AD25 used as DQL6
    31.     PORTC_PCR13 = PORT_PCR_MUX(5);  // FB_AD26 used as DQL5
    32.     PORTC_PCR12 = PORT_PCR_MUX(5);  // FB_AD27 used as DQL4
    33.     PORTB_PCR23 = PORT_PCR_MUX(5);  // FB_AD28 used as DQL3
    34.     PORTB_PCR22 = PORT_PCR_MUX(5);  // FB_AD29 used as DQL2
    35.     PORTB_PCR21 = PORT_PCR_MUX(5);  // FB_AD30 used as DQL1
    36.     PORTB_PCR20 = PORT_PCR_MUX(5);  // FB_AD31 used as DQL0

    37.     // 控制线
    38.    // PORTC_PCR3 = PORT_PCR_MUX(5);   // CLKOUT , FB_CLK  optional
    39.     PORTD_PCR1 = PORT_PCR_MUX(5);  // FB_CS0_b  连接SRAM的 Chip enable端
    40.     PORTC_PCR11 = PORT_PCR_MUX(5);  // FB_RW_b  连接SRAM的 Write enable端
    41.     PORTB_PCR19 = PORT_PCR_MUX(5);  // FB_OE_b  连接SRAM的 Output enable端
    42.     PORTD_PCR6 = PORT_PCR_MUX(5);  // FB_AD0   连接SRAM的 Upper byte select端

    43.     ////////////////////////////////////////////////////////////////////////


    44.     // 设置Flexbus相关的四个寄存器 FB_CSARn,FB_CSMRn,FB_CSCRn,FB_CSPMCR,n取决于实际中用的是哪个CS

    45.     FB_CSMR0 |= FB_CSMR_V_MASK; // we must set V in FB_CSMRn, because it act as a global CS

    46.     // Chip select address resgister ,FB_CSARn
    47.     FB_CSAR0 = FLEX_BUS_BASE_ADDRESS; // Base Address


    48.     // Chip select mask register, FB_CSMR0
    49.     FB_CSMR0 = FB_CSMR_V_MASK | FB_CSMR_BAM(0)  ;



    50.     FB_CSCR0 =  FB_CSCR_PS(1)             /* Set port size  , 8-bit port*/
    51.                 | FB_CSCR_AA_MASK         /* auto-acknowledge(这位设置很重要,非阻塞,数据传输完成(或者等待n个
    52.                                                                waite states)自动终结时钟周期,如果FB_TA不被使能,该位必须置位。) */
    53.                // | FB_CSCR_BLS_MASK        /*  Data is left-aligned on FB_AD,一般就设置为0,这样地址和数据总线不复用  */
    54.                                             /*  8-bit port size ---FB_D[31:24]  ,16-bit port size--16-bit port size.          */


    55.                 | FB_CSCR_BEM_MASK         /* Byte-Enable Mode */


    56.                 | FB_CSCR_WS(0x2)         /* 2 wait state - may need more wait states depending on the bus speed     1 不行 */

    57.                 | FB_CSCR_ASET(0x1)       /* assert chip select on second clock edge after address is asserted
    58.                                                                - may be changed if need */

    59.                 | FB_CSCR_RDAH(0x0)

    60.                 | FB_CSCR_WRAH(0x0)   ;


    61.     // Chip select port multiplexing control register, 对于本demo可以不做设置,因为没有用到相关的线
    62.     FB_CSPMCR = FB_CSPMCR_GROUP1(1)      /* FB_CS1 */
    63.              | FB_CSPMCR_GROUP2(0)     /* FB_CS4 */
    64.              | FB_CSPMCR_GROUP3(0)     /* FB_CS5 */
    65.              | FB_CSPMCR_GROUP4(1)     /* FB_CS2 */
    66.              | FB_CSPMCR_GROUP5(1)  ;   /* FB_CS3 */

    67. }
    复制代码
    分析完这个例子,让我们再来看一个用Flexbus 操作SRAM的例子,
    原理图如下:

    接口如下:


    这个接法和第一种接法有以下不同:
    1)用到了16位数据线
    2)MCU由于FB_AD线不够用,用了FB_A16,A17,A18

    这个其实可以这么理解,FB_A16只能用来做地址线,你可能会好奇它和FB_AD16 有什么区别,其实区别就是FB_A16只能做地址线,FB_AD16既可以做地址线也可以做数据线。在这个例子中,其实是把FB_AD1到FB_AD15只用作地址线,相当于非复用模式。

    3)这里没用到FB_AD0,所以程序中就没配置它。FB_AD0(PTD6)就可以用作其他功能了。SRAM高低位控制信号接的是Flexbus的FB_BE_31_24_b和FB_BE_23_16_b。

    软件流程类似:
    1. void SRAM_Init(void)
    2. {
    3.     /* set SRAM pinMux */
    4.     SIM->SCGC5 |= (SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK);
    5.     /* flexbus clock output(optional, use for debug) */
    6.     PORTC->PCR[3] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // FB_CLKOUT
    7.     /*control signals */
    8.     PORTB->PCR[19] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // FB_OE
    9.     PORTC->PCR[11] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // FB_RW
    10.     PORTD->PCR[0] =  PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // CS1
    11.     PORTC->PCR[16] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // FB_BE_23_16
    12.     PORTC->PCR[17] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;          // FB_BE_31-24
    13.     /* address signal */
    14.     PORTD->PCR[10] = PORT_PCR_MUX(6)|PORT_PCR_DSE_MASK;         //  FB_A18
    15.     PORTD->PCR[9] = PORT_PCR_MUX(6)|PORT_PCR_DSE_MASK;          //  FB_A17
    16.     PORTD->PCR[8] = PORT_PCR_MUX(6)|PORT_PCR_DSE_MASK;          //  FB_A16
    17.     PORTB->PCR[18] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A15
    18.     PORTC->PCR[0]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A14
    19.     PORTC->PCR[1]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A13
    20.     PORTC->PCR[2]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A12
    21.     PORTC->PCR[4]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A11
    22.     PORTC->PCR[5]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A10
    23.     PORTC->PCR[6]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A9
    24.     PORTC->PCR[7]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A8
    25.     PORTC->PCR[8]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A7
    26.     PORTC->PCR[9]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A6
    27.     PORTC->PCR[10] = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A5
    28.     PORTD->PCR[2]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A4
    29.     PORTD->PCR[3]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A3
    30.     PORTD->PCR[4]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A2
    31.     PORTD->PCR[5]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_A1
    32.     /* data signal */
    33.     PORTB->PCR[17]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD16
    34.     PORTB->PCR[16]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD17
    35.     PORTB->PCR[11]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD18
    36.     PORTB->PCR[10]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD19
    37.     PORTB->PCR[9]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_AD20
    38.     PORTB->PCR[8]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_AD21
    39.     PORTB->PCR[7]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_AD22
    40.     PORTB->PCR[6]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;         //  FB_AD23
    41.     PORTC->PCR[15]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD24
    42.     PORTC->PCR[14]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD25
    43.     PORTC->PCR[13]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD26
    44.     PORTC->PCR[12]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD27
    45.     PORTB->PCR[23]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD28
    46.     PORTB->PCR[22]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD29
    47.     PORTB->PCR[21]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD30
    48.     PORTB->PCR[20]  = PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK;        //  FB_AD31
    49.     /* enable flexbus */
    50.     FLEXBUS_InitTypeDef FLEXBUS_InitStruct;
    51.     FLEXBUS_InitStruct.ADSpaceMask = kFLEXBUS_ADSpace_512KByte; /*内存地址范围512Kb
    52.      */
    53.     FLEXBUS_InitStruct.autoAckMode = kFLEXBUS_AutoAckEnable; /*启动自动应答*/
    54.     FLEXBUS_InitStruct.CSn = kFLEXBUS_CS1; /*使用CS1片选信号 */
    55.     FLEXBUS_InitStruct.dataAlignMode = kFLEXBUS_DataLeftAligned; /*数据左对齐 */
    56.     FLEXBUS_InitStruct.dataWidth = kFLEXBUS_PortSize_8Bit; /*数据位宽16位 */
    57.     FLEXBUS_InitStruct.baseAddress = SRAM_ADDRESS_BASE; /* 基地址 */
    58.     FLEXBUS_InitStruct.ByteEnableMode = kFLEXBUS_BE_AssertedReadWrite; /* 在读写操作的时候都插入位使能型号 */
    59.     FLEXBUS_InitStruct.div = 0;
    60.     FLEXBUS_Init(&FLEXBUS_InitStruct);
    61.     /* config Flexbus SRAM pinmux */
    62.     FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group3, kFLEXBUS_CSPMCR_GROUP3_BE_23_16);
    63.     FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group2, kFLEXBUS_CSPMCR_GROUP2_BE_31_24);
    64.     FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group1, kFLEXBUS_CSPMCR_GROUP1_CS1);
    65. }
    复制代码
    Flexbus相关的四个寄存器,FB_CSARn,FB_CSMRn,FB_CSCRn,FB_CSPMCR如下:





    常见问题:
    1)Flexbus上可否挂接多个外设?
    答:可以,每个外设接不通的CS,首先得设置好寄存器FB_CSARn,FB_CSMRn,FB_CSCRn,FB_CSPMCR,一个cs对应一个地址范围,然后会根据不同的地址,自动产生相应的时序操作相应的器件。

    2)FB_CSCR中的AA位到底什么作用?
    答:这个会关联到FB_TA信号线,



    FB_TA 信号使用与否受FB_CSPMCR的GROUP5决定

    可以这么理解,Flexbus通讯过程必须要有应答信号来指示read或者write完成。如果外部器件有这个信号线并且连接到了FB_T上了,这时GROUP5设置的为0,那么AA可以不打开。如果AA也打开,等待FB_CSCR中的WS时间后,产生一个内部的应带信号,如果外部先来应答,那么就提前结束。 如果外部没接应答线,那么AA必须打开,WS的设置很重要。

    3)flexbus相关的信号线很多,如果只用其中一部分,其他的信号线会不会也有数据产生?
    答:只要软件里没有pinmux使能flexbus功能,就不会有影响。



    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2022-5-20 22:42 , Processed in 0.057779 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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