在线时间7 小时
UID153771
注册时间2014-9-14
NXP金币0
该用户从未签到
新手上路

- 积分
- 42
- 最后登录
- 2017-7-6
|
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;
}
|
|