求助407的串口2设置成智能卡模式,只能实现发送接收不了??

2019-07-20 13:29发布

最近做一个项目,需要用到STM32F407ZGT6的串口2的智能卡模式,我依据数据手册来进行设置,PA2设置为复用开漏输出,PA4用于发送固定的频率脉冲,用于智能卡的时钟输入,结果是可以数据发送,却不可以数据的接收,是不是我的设置错误了,有哪位大神做过,能不能帮忙看下哪里设置错误
void USART2_Init(u32 pclk1,u32 bound)
{   
    float temp;
    u16 mantissa;
    u16 fraction;          
    temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV@OVER8=0
    mantissa=temp;                                 //得到整数部分
    fraction=(temp-mantissa)*16; /得到小数部分@OVER8=0
    mantissa<<=4;
    mantissa+=fraction;        
    RCC->AHB1ENR|=1<<0;           //使能PORTA的时钟
    RCC->APB1ENR|=1<<17;          //使能串口2的时钟
    GPIO_Set(GPIOA,PIN2,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_50M,GPIO_PUPD_NONE);//PA2 复用开漏输出
    GPIO_Set(GPIOA,PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA4 复用推挽输出
    GPIO_AF_Set(GPIOA,2,7);        //PA2,AF7
    GPIO_AF_Set(GPIOA,4,7);//PA4,AF7     

   USART2->BRR=mantissa;         //波特率设置       
   USART2->GTPR|=3<<1;                 //SCLK的时钟频率是系统时钟的12分频
   USART2->GTPR|=1<<13;    //保护时间16个时间单位
   USART2->CR1&=~(1<<15);         //OVER8=0
   USART2->CR1|=1<<12;                 //M=1
   USART2->CR1|=1<<10;                 //PCE=1
   USART2->CR1|=1<<3;                   //发送使能
   USART2->CR1|=1<<2;                   //接收时能
   USART2->CR2&=~(1<<14);  //LINEN=0
   USART2->CR2|=7<<11;                  //stop 1.5  使能SCLK
   USART2->CR3|=1<<5;                  //使能智能卡模式
   USART2->CR3&=~(1<<3);   //HDSEL=0
   USART2->CR3&=~(1<<1);   //LREN=0       
   USART2->CR1|=1<<5;            //接收缓冲区非空中断使能                   
   MY_NVIC_Init(3,2,USART2_IRQn,2);
   USART2->CR1|=1<<13;           //使能串口2
}

还是说管脚设置为复用开漏输出要什么外接电路

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
htcq
1楼-- · 2019-07-20 14:36
正点原子 发表于 2016-6-1 21:02
帮顶

已经解决了,其实是我自己犯错误了,启动智能卡模式的话,要等到串口的配置参数配置完全才能使能智能卡模式,所以程序是没有问题,主要是这条指令要放到初始完所有配置后面,启动完智能卡后PA2(开漏输出)就能输入和输出了,PA4能发送频率脉冲,很方便,不需要使用外接电路,希望这个能帮到初次使用407做智能卡模式的人
void USART2_Init(u32 pclk1,u32 bound)
{   
    float temp;
    u16 mantissa;
    u16 fraction;           
    temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV@OVER8=0
    mantissa=temp;                                 //得到整数部分
    fraction=(temp-mantissa)*16; /得到小数部分@OVER8=0
    mantissa<<=4;
    mantissa+=fraction;         
    RCC->AHB1ENR|=1<<0;           //使能PORTA的时钟
    RCC->APB1ENR|=1<<17;          //使能串口2的时钟
    GPIO_Set(GPIOA,PIN2,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_50M,GPIO_PUPD_NONE);//PA2 复用开漏输出
    GPIO_Set(GPIOA,PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA4 复用推挽输出
    GPIO_AF_Set(GPIOA,2,7);        //PA2,AF7
    GPIO_AF_Set(GPIOA,4,7);//PA4,AF7     

   USART2->BRR=mantissa;         //波特率设置        
   USART2->GTPR|=3<<1;                 //SCLK的时钟频率是系统时钟的12分频
   USART2->GTPR|=1<<13;    //保护时间16个时间单位
   USART2->CR1&=~(1<<15);         //OVER8=0
   USART2->CR1|=1<<12;                 //M=1
   USART2->CR1|=1<<10;                 //PCE=1
   USART2->CR1|=1<<3;                   //发送使能
   USART2->CR1|=1<<2;                   //接收时能
   USART2->CR2&=~(1<<14);  //LINEN=0
   USART2->CR2|=7<<11;                  //stop 1.5  使能SCLK
//  USART2->CR3|=1<<5;                  //使能智能卡模式 不能放这里
   USART2->CR3&=~(1<<3);   //HDSEL=0
   USART2->CR3&=~(1<<1);   //LREN=0        
   USART2->CR1|=1<<5;            //接收缓冲区非空中断使能                    
   MY_NVIC_Init(3,2,USART2_IRQn,2);
   USART2->CR3|=1<<5;                  //使能智能卡模式,这个指令要放在这里才行,等到所有配置完成后
   USART2->CR1|=1<<13;           //使能串口2
}
正点原子
2楼-- · 2019-07-20 15:25
 精彩回答 2  元偷偷看……
卖水
3楼-- · 2019-07-20 19:01
这位哥哥,我最近也在忙ICC的项目,但是我对此还没有足够的认识,你能把你的工程发给我参考下吗?还有你PA2是做智能卡的IO,PA4做为智能卡的CLK,还有其他的昵?
我QQ邮箱:1101190752@qq.com    哥哥拜托了,我是刚入职场的小白
sogaside
4楼-- · 2019-07-20 23:28
帮顶一下,请问楼主F407跟卡的接法是怎么样的?有没有例程呢?
sogaside
5楼-- · 2019-07-21 01:04
 精彩回答 2  元偷偷看……
jianxi258
6楼-- · 2019-07-21 02:52
兄弟,我现在也是用407的串口2做PSAM验证,硬件是直接连PSAM卡,我参考官方的例子,收到的应答是错误的,能否指点下,谢谢!

一周热门 更多>