打印

STM32F103C876(48脚)在智能卡中的应用,遇到问题

[复制链接]
5875|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
everbright|  楼主 | 2008-5-9 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我将USART2的模式配置成智能卡模式来与智能卡通信,用示波器检测到USART2_CK脚(PA4)无任何输出,请问在智能卡模式中,它是不是应该输出智能卡的时钟信号呀?怎么配置才正确呢?以下为配置代码,请用过的大侠帮忙:
/*******************************************************************************
* Function Name  : SC_Init
* Description    : Initializes all peripheral used for Smartcard interface.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
static void SC_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  
   /* Enable GPIOA, GPIOB and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  /* Enable USART2 clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
                           
  /* Configure USART2 CK(PA.4) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = SC_CLK;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Configure USART2 Tx (PA.2) as alternate function open-drain */
  GPIO_InitStructure.GPIO_Pin = SC_IO;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure Smartcard Reset  */
  GPIO_InitStructure.GPIO_Pin = SC_RESET;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure Smartcard VCC  */
  GPIO_InitStructure.GPIO_Pin = SC_VCC;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
    
/* USART2 configuration ------------------------------------------------------*/

  /* USART Clock set to 3.6 MHz (PCLK1 (36 MHZ) / 10) */
  USART_SetPrescaler(USART2, 0x05);
  
  /* USART Guard Time set to 16 Bit */
  //在智能卡中需要该功能,当保护时间过去后,发送完成标志才被置起。
  USART_SetGuardTime(USART2, 16);
  
  USART_StructInit(&USART_InitStructure);
  USART_InitStructure.USART_BaudRate = 9677;
  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_Clock = USART_Clock_Enable;
  
  USART_Init(USART2, &USART_InitStructure);

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

  /* Enable the USART2 Framing Error Interrupt */
  USART_ITConfig(USART2, USART_IT_ERR, ENABLE);

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

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

  /* Enable the Smartcard Interface */
  USART_SmartCardCmd(USART2, ENABLE);

  SC_Reset(Bit_RESET);      //复位脚置低电平
  SC_PowerCmd(ENABLE);


}
沙发
everbright|  楼主 | 2008-5-10 16:14 | 只看该作者

我可能找到原因了,现在想请香版主确定一下

因我用到oled显示屏,用到了SPI1接口,而SPI1接口的NSS脚与智能卡的CLK脚是复用同一脚的,我测试每当用SPI1功能时,智能卡接口就不能用了。而且测试当使用SPI1时,NSS可以当普通IO口使用,指定其输出电平高低。但是将NSS再用作智能卡却不行了
请问版主,我的分析是不是实际情况
如果是实际情况的话,那么SPI1和智能卡功能就不能同时使用了

使用特权

评论回复
板凳
香水城| | 2008-5-10 16:40 | 只看该作者

我现在不能确定,但不管怎样你应该把SSOE清零

上班后才能问问我们的工程师是否有人用过这种组合。

使用特权

评论回复
地板
everbright|  楼主 | 2008-5-11 09:33 | 只看该作者

谢谢香帅,等待您的消息

1.我试过了。手册上是让SSOE清零,但实验中SSOE清零不清零都一样效果,只要SPI1的时钟开着RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE)就不成功。
2.现在我是用模拟的SPI功能实现SPI的,这样SPI功能和智能卡能算是同时使用了吧。
3.我希望两种复用功能都能使用,因为我的SPI2也是两种同时使用的,等待您的消息。。。
4.每次提问版主都能给予及时回答,谢谢!!

使用特权

评论回复
5
ST_ARM| | 2008-5-12 12:02 | 只看该作者

请把你的SPI1的初始化代码贴一下。

包括SPI1的IO的配置。

使用特权

评论回复
6
everbright|  楼主 | 2008-5-13 11:36 | 只看该作者

这是初始化代码,有问题吗?

void SPI_OLED_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
   
  /* Enable SPI1 and GPIOA clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE);
  
  /* Configure SPI1 pins: SCK and MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIOA_OLED_SCK | GPIOA_OLED_MOSI;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure PB.0 and PB.1 as Output push-pull, used as OLED Chip select */
  GPIO_InitStructure.GPIO_Pin = GPIOB_OLED_CS | GPIOB_OLED_A0 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure PA.6 as Output push-pull, used as OLED Reset */
  GPIO_InitStructure.GPIO_Pin = GPIOA_OLED_RES ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Deselect the OLED */
  OLED_CS(DISABLE);


  /* SPI1 configuration */ 
  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;       //OLED仅需要发送
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
  
  SPI_SSOutputCmd(SPI1,DISABLE); //关输出
  
  /* Enable SPI1  */
  SPI_Cmd(SPI1, ENABLE);   
}

使用特权

评论回复
7
everbright|  楼主 | 2008-5-20 14:01 | 只看该作者

ST_ARM,我代码贴出很久了,有空分析一下呀,谢谢

使用特权

评论回复
8
ST_ARM| | 2008-5-20 17:24 | 只看该作者

请将NSS输出打开

在SPI的初始化的最后

SPI_SSOutputCmd(SPI1,ENABLE); // 输出NSS信号

这样就可以。

使用特权

评论回复
9
bingningbn| | 2017-8-3 14:48 | 只看该作者
我现在用stm32的smartcard与psam卡通信,选卡,取随机数命令都正确,但是psam的80 1A加密初始化命令发送后没有回应,有遇到类似的问题吗?

使用特权

评论回复
10
biechedan| | 2017-8-3 17:34 | 只看该作者
everbright 发表于 2008-5-10 16:14
因我用到oled显示屏,用到了SPI1接口,而SPI1接口的NSS脚与智能卡的CLK脚是复用同一脚的,我测试每当用SPI1 ...

引脚复用?

使用特权

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

本版积分规则

21

主题

107

帖子

3

粉丝