用STM32的UART3的智能卡模式接智能卡,但工作不正常,具体表现为每次读智能卡前都要重新设置一次智能卡模式,否则与智能卡通讯不上,是否STM32本来就是这样每次都要重新设置一次然后才读取智能卡呢?还是程序设置问题?另外,在本应用中智能卡模式时校验位不管是设为奇校验或偶校验都可以读智能卡,就像校验位没有作用一样.会是什么原因呢?如下是配置程序:
谢谢回复.
void Easrm_Rest(void) // 复位
{
//uint ForI=0;
//++GTime;
//Savep=GTime<<8;
//USART3_GTPR =USART3_GTPR&0x00FF;
//USART3_GTPR=USART3_GTPR|Savep;
UARST_Val.EsarmVal.Rx_Leth=0;//清接电数据
USART3_CR3 &=(~(1<<Bit5));//关智能卡模式,没有此句收不了数
ESARM_RST_L();//智能卡模式复位低
LCD_CloseLed();//智能卡下电
OSTimeDly(20);
USART3_CR3 |=(1<<Bit5);//开智能卡模式,没有此句收不了数
LCD_OpenlLed();//智能卡上电
OSTimeDly(10);
ESARM_RST_H();//智能卡模式复位高
nop();
OSTimeDly(50);////智能卡模式复位收数据
// 以下是收到的数据发到别一串口
Pub_MoveData(UARST_Val.EsarmVal.Rx_Leth,0,0,UARST_Val.EsarmVal.Rx_Save, UARST_Val.Gprs.Tx_Save);
UARST_GrsTx(UARST_Val.EsarmVal.Rx_Leth);
//UARST_Val.EsarmVal.Rx_Leth=0;
//ESARM_RST_L();
//OSTimeDly(10);
// ESARM_RST_H();
}
/*-------------------------------------------------------*/
static void UASRT3_init(uchar Number,uint Bps_Val,uchar StopBit,uchar Evar)
{
/*---------------------------------------------------------------*/
//SET PB12 cLK
GPIOB_CRH|=(1<<Bit16)|(1<<Bit17)|(1<<Bit18)|(1<<Bit19);
GPIOB_CRH &=(~(1<<Bit18));
/*---------------------------------------------------------------*/
//set PB10 PB11
GPIOB_CRH &=(~(1<<Bit12))&(~(1<<Bit13))&(~(1<<Bit15));
GPIOB_CRH |=(1<<Bit11)|(1<<Bit14)|(1<<Bit8)|(1<<Bit9)|(1<<Bit10);
/*---------------------------------------------------------------*/
USART3_CR1=0; //复位串口
USART3_CR2=0;
USART3_CR3=0;
/*---------------------------------------------------------------*/
USART3_BRR = UARSR_Bps(Number,Bps_Val); //设波特率值
/*---------------------------------------------------------------*/
USART3_CR1 |=(1<<Bit12);
//USART1_CR1 &=~(1<<Bit12); // 8 个数据N 个停止位
if(StopBit==UARST_StopBit_One) // 1 个停止位或2 个停止位
{
USART3_CR2 &=(~(1<<Bit12))&(~(1<<Bit13));
}
else if(StopBit==UARST_StopBit_Two)
{
USART3_CR2 |=(1<<Bit13);
USART3_CR2 &=~(1<<Bit12);
}
else if(StopBit==UARST_StopBit_FOne)
{
USART3_CR2 |=(1<<Bit13)|(1<<Bit12);
}
/*---------------------------------------------------------------*/
USART3_CR2 |=(1<<Bit11); // CLKEN 使能
/*---------------------------------------------------------------*/
if(Evar==UARST_None_Parity) //无检验
{
USART3_CR1 &=~(1<<Bit10);
USART3_CR1 &=~(1<<Bit12);
}
else if(Evar==UARST_Even_Parity)//偶校验
{
USART3_CR1 |=(1<<Bit10);
USART3_CR1 &=~(1<<Bit9);
}
else if(Evar==UARST_Odd_Parity)//奇校验
{
USART3_CR1 |=(1<<Bit10)|(1<<Bit9);
}
/*---------------------------------------------------------------*/
//USART3_CR1 |=(1<<Bit7);//发送缓冲区空中断使能
//USART3_CR1 |=(1<<Bit6);
USART3_CR1 |=(1<<Bit5);//接收缓冲区空中断使能
/*---------------------------------------------------------------*/
USART3_CR1 |=(1<<Bit2); //接收使能
USART3_CR1 |=(1<<Bit3);//发送使能
/*---------------------------------------------------------------*/
USART3_CR1 |=(1<<Bit8);//串口中断便能
/*---------------------------------------------------------------*/
USART3_CR2 |=(1<<Bit11); // CLKEN 使能
USART3_CR3 |=(1<<Bit5);
/*---------------------------------------------------------------*/
USART3_GTPR |=(1<<Bit0)|(1<<Bit1);// 24M/6=4M
USART3_CR2 |=(1<<Bit8);
/*---------------------------------------------------------------*/
USART3_CR1 |=(1<<Bit13); //串口使能
IRQ_SETENA1 |=1<<Bit7;
/*---------------------------------------------------------------*/
} |