ATMEL SAM4SD32C SSC总线数据收发配置详解

        最近接触了ATMEL公司的一款基于ARM CORTEX M4的芯片SAM4SD32C,其中在配置SSC总线驱动的寄存器时,碰到了一个小小的麻烦,由于官方没有给出SSC控制器工作在从机模式的例子,所以只有对比着ASF框架给出的示例,修改SSC控制器的寄存器参数,但最后实际在示波器测量中,TD信号线上没有出现写入的数据。其中SSC总线控制器的信号引脚如下:

ATMEL SAM4SD32C SSC总线数据收发配置详解_第1张图片

总线控制器的系统框图如下:

ATMEL SAM4SD32C SSC总线数据收发配置详解_第2张图片

在了解了控制器关联的模块,查阅数据手册:

(1) 配置PIO引脚功能,这些引脚必须配置成SSC外设使用功能,具体可以参考数据手册的外设PIO配置一章内容。

(2)配置SSC的时钟,其中可以调用ASF框架中的PMC系统函数。

(3)如果需要SSC中断,那么可以使用NVIC接口配置中断优先级。

(4)配置SSC接受器和发送器的寄存器参数,包括时钟信号,同步信号,数据长度,高地位等。

(5)最后使能发送和接受,就基本完成配置了。

        SSC控制器可以工作在SLAVE模式下,接收器(Receiver)和发送器(Transmit)的时钟由其他主设备提供,例如解码器,声码器等。接受器(Receiver)和发送器(Transmit)可以用同步模式,可以配置成两种模式:

        <1>接受器(Receiver)的时钟使用发送器(Transmit)的时钟信号,当开始发送数据的时候,同时开始启动接受数据,就是同步方式收发数据。

        <2>相反,同理,发送器(Transmit)可以使用接收器(Receiver)的时钟信号。

异步模式:接受器(Receiver)的时钟和发送器(Transmit)的时钟配置成外围主设备的时钟信号,工作在从机模式下。时钟最高频率不超过主频的一半。

      例如,发送器配置寄存器SSC_TCMR寄存器的CKS位是选择时钟信号源的配置位,三种选择:

(1) 接收器的时钟。

(2) 主时钟的分频。

(3) TK引脚的时钟信号。

注意点:CKS位配置成TK信号当发送器时钟,CKO位配置成连续时钟信号是不允许的,否则,后果未知。时钟配置框图如下:

ATMEL SAM4SD32C SSC总线数据收发配置详解_第3张图片

实际情况中,如果接收器和发送器都配置成外部时钟模式,即CKS位都设成2,那么就不会有数据收发,还得求助下谷歌,有人碰到了同样的问题,

http://www.at91.com/forum/viewtopic.php/f,15/t,18626/

When I first read the SSC section of the datasheet, I was very excited about the flexibility of the peripheral and all the new possibilities, since I have only worked with smaller MCUs before. Little did I know that the described features do not work in all combinations, which not only limits that flexibility, but makes development extremely frustrating since the limitations are not documented. There is an errata section in the datasheet that lists certain conditions that fail or work incorrectly, but it is in no way complete.

Be careful however with the macros AT91C_SSC_CKS_RK and AT91C_SSC_CKS_TK. THEY MUST BE REVERSED FOR THE TRANSMITTER. Check the numeric values: for the receiver its 0x01 to use TK and 0x02 to use RK. Its reversed for the transmitter, therefore the use of the macro must be reveresed as well.

// configure ssc receiver
AT91C_BASE_SSC->SSC_RCMR = AT91C_SSC_CKS_TK | AT91C_SSC_START_TX;
AT91C_BASE_SSC->SSC_RFMR = SSC_DATLEN(16) | AT91C_SSC_MSBF | SSC_DATNB(1) | AT91C_SSC_FSOS_NONE;

// configure ssc transmitter
AT91C_BASE_SSC->SSC_TCMR = AT91C_SSC_CKS_RK | AT91C_SSC_START_FALL_RF | AT91C_SSC_CKI;
AT91C_BASE_SSC->SSC_TFMR = SSC_DATLEN(16) | AT91C_SSC_MSBF | SSC_DATNB(1) | AT91C_SSC_FSOS_NONE;


下面是另外2篇同样碰到SSC配置问题的链接,有点启发:

http://www.embeddedrelated.com/groups/AT91SAM/show/1061.php

http://www.ultimaserial.com/avr_lwip_tips4.html

    总之,在数据手册没有写明白的情况下,多尝试不同的配置,多用谷歌搜索资料,才是王道。



       

你可能感兴趣的:(C语言程序设计)