你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4664|回复: 1

stm32控制PC卡问题!!!!

[复制链接]

1

主题

0

回帖

0

蝴蝶豆

新手上路

最后登录
2020-4-10
发表于 2010-9-29 12:03:58 | 显示全部楼层 |阅读模式
我使用的STM32F103ZCT6 芯片,PC卡使用的CAM(条件接收卡,8位PC卡兼容),硬件接线:
              FSMC                 PC 卡
              A0--A13            A0--A13
              D0--D7             D0--D7
              NEC4_1             CE1
              NIOIS16(接地)     --
              NREG                 NREG
              NIORD                NIORD
              NIOWR               NIOWR
              NOE                   NOE
              NWE                  NWE
              CD                     CD
软件:使用的固件库中提供的结构,初始化如下
        void PCCARD_IO_Init(void)                                             
{                                                                    
    GPIO_InitTypeDef GPIO_InitStructure; 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All&&(!GPIO_Pin_6);
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;                    
 GPIO_Init(GPIOD, &GPIO_InitStructure);                                                                   
 
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//NWAIT
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//GPIO_Mode_IPU;                    
 GPIO_Init(GPIOD, &GPIO_InitStructure);     
       
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//GPIO_Mode_AF_PP;                    
 GPIO_Init(GPIOE, &GPIO_InitStructure);                             
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All&&(!(GPIO_Pin_9|GPIO_Pin_11));
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//GPIO_Mode_AF_PP;                    
 GPIO_Init(GPIOF, &GPIO_InitStructure);
 
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//CD1
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//GPIO_Mode_AF_PP;                    
 GPIO_Init(GPIOF, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//NIOS16
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;//GPIO_Mode_AF_PP;                    
 GPIO_Init(GPIOF, &GPIO_InitStructure);
       
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//GPIO_Mode_AF_PP;                    
 GPIO_Init(GPIOG, &GPIO_InitStructure);              
         
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12; //CD2#
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//;                    
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10|GPIO_Pin_9; //RDX1 TXD1
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//;                    
 GPIO_Init(GPIOA, &GPIO_InitStructure);
                             
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8; //OE1
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//;                    
 GPIO_Init(GPIOA, &GPIO_InitStructure);                            
 /*OE2,OE3,OE4,OE5*/
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//;                    
 GPIO_Init(GPIOC, &GPIO_InitStructure);  
 /*PRESET,CAM_PWR*/
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15|GPIO_Pin_14;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//;                    
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 /*I2C_SMBA1,RXD3/SDL,TXD3/SDA*/
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//;                    
 GPIO_Init(GPIOB, &GPIO_InitStructure);    
      

void PCCARD_FSMCConfig(void)
{
 FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure;
 FSMC_NAND_PCCARDTimingInitTypeDef p;
 p.FSMC_SetupTime = 3;
 p.FSMC_WaitSetupTime = 3;
 p.FSMC_HoldSetupTime = 3;
 p.FSMC_HiZSetupTime = 0;
 //FSMC_PCCARDInitStructure.FSMC_Bank = ;
 FSMC_PCCARDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Disable; //禁止等待
 FSMC_PCCARDInitStructure.FSMC_AddressLowMapping = FSMC_AddressLowMapping_Direct;//低地址直接映射
        //
        FSMC_PCCARDInitStructure.FSMC_PWID = FSMC_MemoryDataWidth_16b;//数据宽度16位,STM32只能16位访问
        FSMC_PCCARDInitStructure.FSMC_PTYP = FSMC_MemoryType_PCCARD;//卡类型为PCCARD
   
       FSMC_PCCARDInitStructure.FSMC_TCLRSetupTime = 0x0;
 FSMC_PCCARDInitStructure.FSMC_TARSetupTime = 0x0;
 FSMC_PCCARDInitStructure.FSMC_CommonSpaceTimingStruct = &p;
 FSMC_PCCARDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;
 FSMC_PCCARDInitStructure.FSMC_IOSpaceTimingStruct = &p;
 FSMC_PCCARDInit(&FSMC_PCCARDInitStructure);
 FSMC_PCCARDCmd(ENABLE);
 }
2、我的测试程序如下:
#define PCCARD_reg_base   0x98000000 
#define PCCARD_io_base   0x9c000000
RCC_Configuration();
 NVIC_Configuration();
 
PCCARD_IO_Init();
PCCARD_FSMCConfig();
Delay(300);
 GPIO_SetBits(RESET_PORT, RESET);//对卡reset
 Delay(300);
 GPIO_ResetBits(RESET_PORT, RESET);
 
 *(u16*)(PCCARD_io_base ) = N;//这句可运行,但控制线,地址,数据线状态不对
  *(u16*)(PCCARD_reg_base ) = N;//此句运行后,程序就进入FaultISR中去了。
 N = *(u16*)(PCCARD_io_base );
 N = *(u16*)(PCCARD_reg_base );
请各位高手帮我看看,是什么原因?还有一事请教,PC卡的读写模式(IO模式(IOWR,IORD),属性模式(OE,WR),)是使用不同的地址,STM32就能产生不同的读写控制信号吗?
 
回复

使用道具 举报

3

主题

10

回帖

0

蝴蝶豆

初级会员

最后登录
2019-5-27
发表于 2011-9-20 12:06:39 | 显示全部楼层

回复:stm32控制PC卡问题!!!!

我用NCE4_2控制PCCARD,也是遇到同样问题,NCE4_2,NWE,NOE都没有电平变化
#define Bank_PCCARD_ADDR     Bank4_PCCARD_ADDR 
#define Bank4_PCCARD_ADDR    ((uint32_t)0x90000000)

void PCCARD_Init(void)
{
  FSMC_PCCARDInitTypeDef FSMC_PCCADRInitStructure;
  FSMC_NAND_PCCARDTimingInitTypeDef p;
  p.FSMC_SetupTime = 3;
  p.FSMC_WaitSetupTime = 3;
  p.FSMC_HoldSetupTime = 3;
  p.FSMC_HiZSetupTime = 0;
  FSMC_PCCADRInitStructure;.FSMC_Waitfeature = FSMC_Waitfeature_Disable; //禁止等待
   
  FSMC_PCCADRInitStructure;.FSMC_TCLRSetupTime = 0x0;
  FSMC_PCCADRInitStructure;e.FSMC_TARSetupTime = 0x0;
  FSMC_PCCADRInitStructure;e.FSMC_CommonSpaceTimingStruct = &p;
  FSMC_PCCADRInitStructure;.FSMC_AttributeSpaceTimingStruct = &p;
  FSMC_PCCADRInitStructure;.FSMC_IOSpaceTimingStruct = &p;
  FSMC_PCCARDInit(&FSMC_CPLDInitStructure);
  FSMC_PCCARDCmd(ENABLE);
}


void PCCARD_WriteReg(uint16_t PCCARD_Reg, uint16_t PCCARD_RegValue)
{
  /* Write 16-bit Index, then Write Reg */
  *(__IO uint16_t *)(Bank4_PCCARD_ADDR)  = PCCARD_Reg;
  /* Write 16-bit Reg */
  *(__IO uint16_t *)(Bank4_PCCARD_ADDR) = PCCARD_RegValue;
}

在主程序中调用 PCCARD_WriteReg(0x0008,0x0000);之前已经做好管脚配置和时钟开启的工作了。

使用示波器监控NCE4_2和NWE的波形, 管脚配置和时钟开启后,NCE4_2和NWE都是高电平,这是正常的。但是执行PCCARD_WriteReg(0x08,0x0000)时,NCE4_2和NWE都没有电平变化,请问哪位大侠能指教是何原因呢?是否是
#define Bank4_PCCARD_ADDR    ((uint32_t)0x90000000) 的地址不正确?
谢谢!
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版