查看: 1885|回复: 0

[求助] K60 LFAX BUS 读写外部SRAM问题

[复制链接]

该用户从未签到

0

主题

3

帖子

0

新手上路

Rank: 1

积分
42
最后登录
2017-7-6
发表于 2014-9-16 10:53:51 | 显示全部楼层 |阅读模式
K60 flaxbus 读写外部SRAM程序出现问题,CS1 OE WE 等信号引脚在读写时候没有相应的高低电平等变化,我们配置的是16BIT读写,寻找不到什么原因,程序如下:
 
 /*
  ******************************************************************************
  * @file    flexbus.h
  * @author  
  * @version 
  * @date    
  * @brief   
  * @note    此文件为芯片FlexBus模块的底层功能函数
  ******************************************************************************
  */
#ifndef __CH_LIB_FLEXBUS_H__
#define __CH_LIB_FLEXBUS_H__
 
#include
 
//!< Flexbus 数据对其方式选择
#define kFLEXBUS_DataLeftAligned   (0x00)  //数据左对齐
#define kFLEXBUS_DataRightAligned  (0x01)  //数据右对齐
 
//!< Flexbus 自动应答信号使能
#define kFLEXBUS_AutoAckEnable     (0x00)  //自动应答使能
#define kFLEXBUS_AutoAckDisable    (0x01)  //关闭自动应答
 
//!< Flexbus 端口位宽选择
#define kFLEXBUS_PortSize_8Bit     (0x01)  //端口数据宽度:8位
#define kFLEXBUS_PortSize_16Bit    (0x02)  //端口数据宽度:16位
#define kFLEXBUS_PortSize_32Bit    (0x00)  //端口数据宽度:32位
 
//!< Flexbus 片选信号选择 
#define kFLEXBUS_CS0               (0x00)  //0号片选信号
#define kFLEXBUS_CS1               (0x01)  //1号片选信号
#define kFLEXBUS_CS2               (0x02)  //2号片选信号
#define kFLEXBUS_CS3               (0x03)  //3号片选信号
#define kFLEXBUS_CS4               (0x04)  //4号片选信号
#define kFLEXBUS_CS5               (0x05)  //5号片选信号
 
//!< Flexbus 片选范围 参考选择
#define kFLEXBUS_ADSpace_64KByte        (0x00) //外挂SRAM尺寸 64k
#define kFLEXBUS_ADSpace_128KByte       (0x01) //外挂SRAM尺寸 128k
#define kFLEXBUS_ADSpace_512KByte       (0x07) //外挂SRAM尺寸 512k
#define kFLEXBUS_ADSpace_1MByte         (0x0F) //外挂SRAM尺寸 1m
 
//!< Flexbus BE信号控制模式选择
#define kFLEXBUS_BE_AssertedWrite       (0x00) //BE信号功能:写
#define kFLEXBUS_BE_AssertedReadWrite   (0x01) //BE信号功能:读写
 
 
typedef enum
{
    kFLEXBUS_CSPMCR_Group1,
    kFLEXBUS_CSPMCR_Group2,  
    kFLEXBUS_CSPMCR_Group3,
    kFLEXBUS_CSPMCR_Group4,
    kFLEXBUS_CSPMCR_Group5,    
}FLEXBUS_PortMultiplexingSelect_Type;
 
//!< Flexus 控制信号复用选择
#define kFLEXBUS_CSPMCR_GROUP1_ALE      (0x00)
#define kFLEXBUS_CSPMCR_GROUP1_CS1      (0x01)
#define kFLEXBUS_CSPMCR_GROUP1_TS       (0x02)
#define kFLEXBUS_CSPMCR_GROUP2_CS4      (0x00)
#define kFLEXBUS_CSPMCR_GROUP2_TSIZ0    (0x01)
#define kFLEXBUS_CSPMCR_GROUP2_BE_31_24 (0x02)
#define kFLEXBUS_CSPMCR_GROUP3_CS5      (0x00)
#define kFLEXBUS_CSPMCR_GROUP3_TSIZ1    (0x01)
#define kFLEXBUS_CSPMCR_GROUP3_BE_23_16 (0x02)
#define kFLEXBUS_CSPMCR_GROUP4_TBST     (0x00)
#define kFLEXBUS_CSPMCR_GROUP4_CS2      (0x01)
#define kFLEXBUS_CSPMCR_GROUP4_BE_15_8  (0x02)
#define kFLEXBUS_CSPMCR_GROUP5_TA       (0x00)
#define kFLEXBUS_CSPMCR_GROUP5_CS3      (0x01)
#define kFLEXBUS_CSPMCR_GROUP5_BE_7_0   (0x02)
 
//!< FLEXBUS初始化结构体
typedef struct
{
    uint32_t div;             //总线速度分频
    uint32_t dataWidth;       //数据总线数据宽度
    uint32_t baseAddress;     //设备基地址
    uint32_t ADSpaceMask;     //设备存储空间
    uint32_t dataAlignMode;   //数据对齐方式
    uint32_t autoAckMode;     //自动应答模式
    uint32_t ByteEnableMode;  //BE使能模式
    uint32_t CSn;             //片选信号通道
}FLEXBUS_InitTypeDef;
 
//!< API functions
void FLEXBUS_Init(FLEXBUS_InitTypeDef* FLEXBUS_InitStruct);
void FLEXBUS_PortMuxConfig(FLEXBUS_PortMultiplexingSelect_Type group, uint32_t config);
 
#endif
//----------------------------------------------------------------------------------------------------------------------------------------
 
#include "flexbus.h"
#include "mk60f15.h"
 
/**
 * @brief  初始化FlexBus模块
 * @note   具体的配置应用详见关于FlexBus的使用例程  
 * @param  FLEXBUS_InitStruct :FlexBus初始化配置结构体,详见FlexBus.h
 * @retval None
 */
void FLEXBUS_Init(FLEXBUS_InitTypeDef* FLEXBUS_InitStruct)
{
    /* enable clock gate enable seruriy mode */
    SIM_BASE_PTR->SOPT2 |= SIM_SOPT2_FBSL(3);
    SIM_BASE_PTR->SCGC7 |= SIM_SCGC7_FLEXBUS_MASK;
    /* div */
    SIM_BASE_PTR->CLKDIV1 &= ~SIM_CLKDIV1_OUTDIV3_MASK;
    SIM_BASE_PTR->CLKDIV1 |= SIM_CLKDIV1_OUTDIV3(FLEXBUS_InitStruct->div);
    /* we must set V_MASK in CS0, because CS0.CSMR.V_MASK act as a global CS */
    FB_BASE_PTR->CS[0].CSMR |= FB_CSMR_V_MASK; 
    /* clear registers */
    FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR = 0;
    /* base address */
    FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSAR = FLEXBUS_InitStruct->baseAddress;
    /* address space */
    FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSMR = FB_CSMR_BAM(FLEXBUS_InitStruct->ADSpaceMask) | FB_CSMR_V_MASK;
    /* port size */
    FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR &= FB_CSCR_PS_MASK;
    FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR |= FB_CSCR_PS(FLEXBUS_InitStruct->dataWidth);
    /* AutoAcknogement(AA) Config */
    if(FLEXBUS_InitStruct->autoAckMode == kFLEXBUS_AutoAckEnable)
    {
        FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR |= FB_CSCR_AA_MASK;
    }
    else
    {
        FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR &= ~FB_CSCR_AA_MASK;
    }
    /* data align */
    if(FLEXBUS_InitStruct->dataAlignMode == kFLEXBUS_DataLeftAligned)
    {
        FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR &= ~FB_CSCR_BLS_MASK;
    }
    else
    {
        FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR |= FB_CSCR_BLS_MASK;
    }
    /* byte enable mode */
    if(FLEXBUS_InitStruct->ByteEnableMode == kFLEXBUS_BE_AssertedWrite)
    {
        FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR &= ~FB_CSCR_BEM_MASK;
    }
    else
    {
        FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR |= FB_CSCR_BEM_MASK;
    }
    /* assert wait status */
    FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR &= ~FB_CSCR_WS_MASK;
    FB_BASE_PTR->CS[FLEXBUS_InitStruct->CSn].CSCR |= FB_CSCR_WS(1);
}
 
 
void FLEXBUS_PortMuxConfig(FLEXBUS_PortMultiplexingSelect_Type group, uint32_t config)
{
    /* CS Port Multiplexing Cotrol */
    switch(group)
    {
        case kFLEXBUS_CSPMCR_Group1:
            FB_BASE_PTR->CSPMCR &= ~FB_CSPMCR_GROUP1_MASK;
            FB_BASE_PTR->CSPMCR |= FB_CSPMCR_GROUP1(config);
            break;
        case kFLEXBUS_CSPMCR_Group2:
            FB_BASE_PTR->CSPMCR &= ~FB_CSPMCR_GROUP2_MASK;
            FB_BASE_PTR->CSPMCR |= FB_CSPMCR_GROUP2(config);
            break;
        case kFLEXBUS_CSPMCR_Group3:
            FB_BASE_PTR->CSPMCR &= ~FB_CSPMCR_GROUP3_MASK;
            FB_BASE_PTR->CSPMCR |= FB_CSPMCR_GROUP3(config);
            break;
        case kFLEXBUS_CSPMCR_Group4:
            FB_BASE_PTR->CSPMCR &= ~FB_CSPMCR_GROUP4_MASK;
            FB_BASE_PTR->CSPMCR |= FB_CSPMCR_GROUP4(config);
            break;
        case kFLEXBUS_CSPMCR_Group5:
            FB_BASE_PTR->CSPMCR &= ~FB_CSPMCR_GROUP5_MASK;
            FB_BASE_PTR->CSPMCR |= FB_CSPMCR_GROUP5(config);
            break;
        default:
            break;
    }
}
//-----------------------------------------------------------------------------------------------------------------------
/**
  ******************************************************************************
  * @file    sram.h
  * @author  
  * @version 
  * @date    
  * @brief   
  ******************************************************************************
  */
#ifndef __SRAM_H__
#define __SRAM_H__
#include "flexbus.h"
 
/* SRAM 基地址 */
#define SRAM_ADDRESS_BASE   (0x70000000)
/* SRAM Size */
#define SRAM_SIZE            (1024*1024)
#define SRAM_START_ADDRESS        (volatile uint16_t *)(SRAM_ADDRESS_BASE)
 
//!< API functions
void SRAM_Init(void);
uint32_t SRAM_SelfTest(void);
 
 
#endif
//-----------------------------------------------------------------------------------------------------------------------------
/**
  ******************************************************************************
  * @file    sram.c
  * @author  
  * @version 
  * @date    
  * @brief   
  ******************************************************************************
  */
#include "sram.h"
#include "flexbus.h"
 
 
//SRAM初始化配置
void SRAM_Init(void)
{
 
    /* enable flexbus */
    FLEXBUS_InitTypeDef FLEXBUS_InitStruct;
    FLEXBUS_InitStruct.ADSpaceMask = kFLEXBUS_ADSpace_1MByte; /* 内存地址范围 512K */
    FLEXBUS_InitStruct.autoAckMode = kFLEXBUS_AutoAckEnable; /*启动自动应答 */
    FLEXBUS_InitStruct.CSn = kFLEXBUS_CS1; /*使用CS1片选信号 */
    FLEXBUS_InitStruct.dataAlignMode = kFLEXBUS_DataLeftAligned; /*数据左对齐 */
    FLEXBUS_InitStruct.dataWidth = kFLEXBUS_PortSize_16Bit; /*数据位宽 16位 */
    FLEXBUS_InitStruct.baseAddress = SRAM_ADDRESS_BASE; /* 基地址 */
    FLEXBUS_InitStruct.ByteEnableMode = kFLEXBUS_BE_AssertedReadWrite; /* 在读写操作的时候都插入 位使能信号 */
    FLEXBUS_InitStruct.div = 0;
    FLEXBUS_Init(&FLEXBUS_InitStruct);
    /* config Flexbus SRAM pinmux */
    FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group3, kFLEXBUS_CSPMCR_GROUP3_BE_23_16);
    FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group2, kFLEXBUS_CSPMCR_GROUP2_BE_31_24);
    FLEXBUS_PortMuxConfig(kFLEXBUS_CSPMCR_Group1, kFLEXBUS_CSPMCR_GROUP1_CS1);
}
 
//自测试程序,向sram中写数据,然后读出数据,验证数据的正确性
uint32_t SRAM_SelfTest(void)
{
    uint32_t i;
    uint32_t err_cnt = 0;
    volatile uint16_t * SRAM_START_ADDR = SRAM_START_ADDRESS;
    for(i = 0; i < SRAM_SIZE; i++)
    {
        SRAM_START_ADDR = i%0xFF; //向SRAM指定地址写数据
        if((SRAM_START_ADDR) != (i%0xFF))  //读取SRAM中的指定数据
        {
            err_cnt++;
        }
    }
    return  err_cnt;
}



 
 
我知道答案 目前已有0人回答
1.png
2.png
3.png
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-20 19:30 , Processed in 0.156306 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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