打印

用STM32F103的UART3智能卡模式时工作不正常

[复制链接]
6055|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
行不改名|  楼主 | 2010-5-4 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用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;
/*---------------------------------------------------------------*/
}
沙发
vigia| | 2010-5-5 10:28 | 只看该作者
应该是代码的问题

ST有智能卡接口的DEMO程序的:
http://www.st.com/stonline/produ ... ro/files/an2598.zip

还有用户手册:
http://www.st.com/stonline/products/literature/an/13750.pdf

使用特权

评论回复
板凳
行不改名|  楼主 | 2010-5-5 18:25 | 只看该作者
谢谢VIGIA提醒,偶再查下。。。。

使用特权

评论回复
地板
行不改名|  楼主 | 2010-5-5 18:25 | 只看该作者
谢谢VIGIA提醒,偶再查下。。。。

使用特权

评论回复
5
tsyejay| | 2010-10-29 00:29 | 只看该作者
不知楼主的问题解决了没有?我也正在用它,从示波器上看到了ATR,但总是不进接收中断,改为查询方式,标志位也没有置位。发送数据全变成了7位数据加一位校验,IC卡返回校验错(USART3)。同时我发现用USART1的普通串口功能加上校验位以后也不正常。

使用特权

评论回复
6
vigia| | 2010-10-29 10:35 | 只看该作者
不知楼主的问题解决了没有?我也正在用它,从示波器上看到了ATR,但总是不进接收中断,改为查询方式,标志位也没有置位。发送数据全变成了7位数据加一位校验,IC卡返回校验错(USART3)。同时我发现用USART1的普通串 ...
tsyejay 发表于 2010-10-29 00:29



不要一有问题就怀疑芯片BUG

请问,你参考了ST提供的文档和DEMO程序了吗?

使用特权

评论回复
7
zhaoyun1234| | 2010-10-29 15:37 | 只看该作者
总之我用过USART的智能卡模式了,一切正常,一定是你们的程序有问题。还有楼主自己操作的寄存器为什么不用库函数呢,不要为了省几句代码,这样问题都不好找

使用特权

评论回复
8
zhaoyun1234| | 2010-10-29 15:43 | 只看该作者
void USARTConfigration(void)
{
    USART_InitTypeDef USART_InitStructure;
  /* USART1 configured as follow:
        - Word Length = 9 Bits
        - 1.5 Stop Bit
        - Even parity
        - BaudRate = 10753 baud
        - Hardware flow control disabled (RTS and CTS signals)
        - Tx and Rx enabled
        - USART Clock enabled
  */
  /* USART Clock set to 4MHz (PCLK2 = 72 MHZ / 18) */
  USART_SetPrescaler(USART1, 0x09);
  /* USART Guard Time set to 2 Bit */
  USART_SetGuardTime(USART1, 0x02);
  
  USART_StructInit(&USART_InitStructure);
  USART_InitStructure.USART_BaudRate = 10753;//9600;//12096;
  USART_InitStructure.USART_WordLength = USART_WordLength_9b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1_5;
  USART_InitStructure.USART_Parity = USART_Parity_Even;
  //USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_InitStructure.USART_Clock = USART_Clock_Enable;
  USART_InitStructure.USART_LastBit = USART_LastBit_Enable;
  USART_Init(USART1, &USART_InitStructure);

  /* Enable the USART3 Parity Error Interrupt */
  USART_ITConfig(USART1, USART_IT_PE, ENABLE);

  /* Enable USART1 */
  USART_Cmd(USART1, ENABLE);

  /* Enable the NACK Transmission */
  USART_SmartCardNACKCmd(USART1, ENABLE);

  /* Enable the Smart Card Interface */
  USART_SmartCardCmd(USART1, ENABLE);
}
这是我的UASART初始化

使用特权

评论回复
9
mochou| | 2010-12-2 11:16 | 只看该作者
学习下,

使用特权

评论回复
10
ningzb| | 2010-12-2 13:54 | 只看该作者
如果或以芯片有问题就看勘误表,勘误表上没有列的,一般的人应该碰不到,碰到了,就说明你中彩票了:lol

使用特权

评论回复
11
xxx378087736| | 2011-12-2 14:56 | 只看该作者
如果是用了ST8024,很大可能是初始化中的时序有问题

使用特权

评论回复
12
roc929| | 2014-4-29 11:44 | 只看该作者
串口3的时钟PCLK1=36MHz ,分频后为4.5MHz 可以用,我用成功了,你看看是不是跟这个时钟频率有关

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

153

帖子

2

粉丝