我使用的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就能产生不同的读写控制信号吗? |
回复:stm32控制PC卡问题!!!!
#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) 的地址不正确?
谢谢!