8286|12

3416

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【Atmel SAM R21】SERCOM!SERCOM! [复制链接]

本帖最后由 ljj3166 于 2014-12-20 17:06 编辑

最早在浏览R21数据手册的时候
就注意到了SERCOM这么个玩意儿
目前的理解,类似于端口复用
这种模块其实很多厂家不同内核的单片机都有,STM、TI、PIC等等
不过ATMEL并不是将单个端口进行复用
而是将整个串行通信模块进行复用
可以复用的模块种类主要是USART、SPI和IIC
框图:

R21共有6个SERCOM,但只有5个可以复用
Note: 1. SERCOM4 is internally connected to the AT86RF233.
SERCOM4被用作SPI接口,使内核与AT86RF233进行通信,这个口并未引出
每个SERCOM其实都包含有三个寄存器、4个端口(PAD0-PAD3)和一系列内部模块
针对不同的通信方式,每个寄存器和端口的作用又不一样,但内部模块是可以通用的
其实在配置SERCOM的时候,同样也是需要配置复用端口的,看看SERCOM3进行SPI的配置
        spi_get_config_defaults(&config);//恢复默认设置SPI
       //config.mode = CONF_SPI_MASTER_MODULE;//理论上应该有这一句,但是例程中没有,例程头文件已经定义了
        config.mux_setting     = CONF_SPI_MASTER_SPI_MUX;  //MUX设置为SPI功能
        config.pinmux_pad0     = CONF_SPI_MASTER_DATA_IN_PIN_MUX;//配置DIN
        config.pinmux_pad1     = PINMUX_UNUSED;//未使用
        config.pinmux_pad2     = CONF_SPI_MASTER_DATA_OUT_PIN_MUX;//配置DOUT
        config.pinmux_pad3     = CONF_SPI_MASTER_SCK_PIN_MUX;//配置SCK
        config.mode_specific.master.baudrate = TEST_SPI_BAUDRATE;//配置SPI速率
        status = spi_init(&master, CONF_SPI_MASTER_MODULE, &config);//初始化

这里例程里面没有设置SERCOM口,其实在例程的头文件里面就配置这个SPI口在SERCOM3(CONF_SPI_MASTER_MODULE)了
瞧瞧数据手册:

手册上说,PB02、PB03、PB22、PB23可用作SERCOM5
就拿这货开刀,把SERCOM5配置成USART和SPI
--------------------------------------------------------------------------------------------------------------------------------
1、USART
直接上代码:
usart_get_config_defaults(&config_usart);
        config_usart.baudrate    = 115200;
        config_usart.mux_setting = USART_RX_1_TX_0_XCK_1;
        config_usart.pinmux_pad0 = PINMUX_PB02D_SERCOM5_PAD0;
        config_usart.pinmux_pad1 = PINMUX_PB03D_SERCOM5_PAD1;
        config_usart.pinmux_pad2 = PINMUX_PB22D_SERCOM5_PAD2;
        config_usart.pinmux_pad3 = PINMUX_PB23D_SERCOM5_PAD3;
        while (usart_init(&usart_instance,
                        SERCOM5, &config_usart) != STATUS_OK) {
        }

其实通信只用到了PB02和PB03,估计pad2和pad3直接设置为UNUSE就行了硬件连接:

在看ATMEL的串口时,发现在AS的代码里面,串口服务函数里面有些Callback函数
它可以根据串口缓存的大小来使用,接收的字符数量等于或者超过串口缓存的大小,就调用callback函数
类似于串口中断服务程序
这里觉得ATMEL确实是很牛x
个人理解,串口缓存是由软件进行判断,所以服务函数叫callback,而不叫中断服务函数
真正意义上的中断应该是完全由硬件引起的吧
不得不佩服ATMEL的严谨
感觉被ST给骗了,什么玩意儿都叫中断
上GIF:

串口助手2s发送一次数据“Hello EEWORLD!”,给R21回显
串口缓存1个字节就callback

2、自环SPI测试
把SERCOM3配置成master,把SERCOM5配置成slave
spi_get_config_defaults(&config);
        config.mux_setting     = CONF_SPI_MASTER_SPI_MUX;
        config.pinmux_pad0     = CONF_SPI_MASTER_DATA_IN_PIN_MUX;
        config.pinmux_pad1     = PINMUX_UNUSED;
        config.pinmux_pad2     = CONF_SPI_MASTER_DATA_OUT_PIN_MUX;
        config.pinmux_pad3     = CONF_SPI_MASTER_SCK_PIN_MUX;
        config.mode_specific.master.baudrate = TEST_SPI_BAUDRATE;
        status = spi_init(&master, CONF_SPI_MASTER_MODULE, &config);
        test_assert_true(test, status == STATUS_OK,
                        "SPI master initialization failed");
        /* Enable the SPI master */
        spi_enable(&master);
        status = STATUS_ERR_IO;
        /* Configure the SPI slave */
        spi_get_config_defaults(&config);
        config.mode                 = SPI_MODE_SLAVE;
        config.mux_setting          = CONF_SPI_SLAVE_SPI_MUX;
        config.pinmux_pad0          = CONF_SPI_SLAVE_DATA_IN_PIN_MUX;
        config.pinmux_pad1          = CONF_SPI_SLAVE_SS_PIN_MUX;
        config.pinmux_pad2          = CONF_SPI_SLAVE_DATA_OUT_PIN_MUX;
        config.pinmux_pad3          = CONF_SPI_SLAVE_SCK_PIN_MUX;
        config.mode_specific.slave.frame_format   = SPI_FRAME_FORMAT_SPI_FRAME;
        config.mode_specific.slave.preload_enable = true;
        status = spi_init(&slave, CONF_SPI_SLAVE_MODULE, &config);

        test_assert_true(test, status == STATUS_OK,
                        "SPI slave initialization failed");
        /* Enable the SPI slave */
        spi_enable(&slave);

不多解释了
硬件连接:
EXT1 PIN15 (PB03) <--> EXT1 PIN10 (PA23)
EXT1 PIN16 (PB22) <--> EXT1 PIN9  (PA22)
EXT1 PIN17 (PB02) <--> EXT1 PIN7  (PA18)
EXT1 PIN18 (PB23) <--> EXT1 PIN8  (PA19)

上GIF:


今天只是简单测试了一下传说中的SERCOM
下回研究一下R21的时钟



最新回复

楼主你好,我打算用SAMD20在项目中,遇到个问题:   用ASF CLOCK_QUICK_START_CLOCK1,  48MHz, 加入了UART    UART输出EDBG,115200波特率,但是电脑的串口助手显示老是乱码 谢谢  详情 回复 发表于 2016-8-29 02:58

赞赏

1

查看全部赞赏

点赞 关注(1)
个人签名

So TM what......?

 

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
沙发自留,干掉〇回复。

点评

围观围观  详情 回复 发表于 2014-12-20 19:55
 
个人签名

So TM what......?

 

 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

板凳
 
ljj3166 发表于 2014-12-20 17:07
沙发自留,干掉〇回复。


围观围观
 
 
 

回复

79

帖子

1

TA的资源

一粒金砂(中级)

4
 
支持一下
 
 
 

回复

5979

帖子

8

TA的资源

版主

5
 
不错 不错!
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

1万

帖子

25

TA的资源

版主

6
 
很详细,先收藏在研究。
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

7
 
关于ATSAM的SERCOM,有些概念不清晰,麻烦指导下。多谢!
以SAMD20为例:
1)SERCOM-x有4pad,可否同时配置为I2C和UART,各占2pin?
2)以SERCOM0为例,其由2组IO复用(PA04/05/06/07, PA08/09/10/11);若PA04/05/06/07分配为SPI,另一组PA08/09/10/11可否配置为I2C或UART呢?也就是说,两组IO可否同时配置为同一SERCOM-x?

点评

以下个人看法,未经验证 1)各种串行外设是以模块电路的形式光刻于芯片内部 用选择器矩阵来确定使用哪种外设连接至对应IO 也就是说,每次只能使用一种外设 2)个人觉得可行 不同的外设通过不同的matrix连接至不  详情 回复 发表于 2016-2-24 14:47
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

8
 
本帖最后由 ljj3166 于 2016-2-24 14:48 编辑
lzm1019 发表于 2016-2-24 12:49
关于ATSAM的SERCOM,有些概念不清晰,麻烦指导下。多谢!
以SAMD20为例:
1)SERCOM-x有4pad,可否同时配 ...

以下个人看法,未经验证
1)各种串行外设是以模块电路的形式光刻于芯片内部
用选择器矩阵来确定使用哪种外设连接至对应IO
也就是说,每个时刻只能使用一种外设除非能做到时分复用
2)个人觉得可行
不同的外设通过不同的matrix连接至不同的IO
如果芯片没有作限制的话,应该是可以的
最好能看看数据手册对应的外设框图

点评

多谢。 关于提问的两点,特意去ATMEL的Q&A查了下, 1)查看 http://atmel.force.com/support/articles/en_US/FAQ/Using-the-unused-SERCOM-pads-for-alternate-functions-SAMR21 某一SERCOM分配后,未使用的PAD  详情 回复 发表于 2016-2-24 15:47
 
个人签名

So TM what......?

 

 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

9
 
ljj3166 发表于 2016-2-24 14:47
以下个人看法,未经验证
1)各种串行外设是以模块电路的形式光刻于芯片内部
用选择器矩阵来确定使用哪 ...

多谢。
关于提问的两点,特意去ATMEL的Q&A查了下,
1)查看
http://atmel.force.com/support/a ... te-functions-SAMR21
某一SERCOM分配后,未使用的PAD可以另作它用,但是否能配置为特定的接口,语焉不详。
至于时分复用,则明确是可以的,见
http://atmel.force.com/support/a ... runtime-without-ASF
2)关于两组IO是否同时配置为同一SERCOM,这个问题,未找到任何相关的说法。
个人理解,应该是可以的,因为做IO配置时,设置的是具体某一IO的寄存器,而非SERCOM寄存器。
不知确切与否,望指正。
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

10
 
其实,上述问题,一直都存有;不过,使用ST的芯片时,未分配的IO理所当然的视为普通IO。
而此次计划使用ATMEL的SAMD20芯片,才发现ATMEL别出心裁的把SPI/UART/I2C整合在一起,导致上述疑问,不澄清,心里总是有疙瘩。

点评

第二点可以自己试验一下 同时最好能够与FAE联系确认  详情 回复 发表于 2016-2-24 16:05
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

11
 
lzm1019 发表于 2016-2-24 15:51
其实,上述问题,一直都存有;不过,使用ST的芯片时,未分配的IO理所当然的视为普通IO。
而此次计划使用AT ...

第二点可以自己试验一下
同时最好能够与FAE联系确认

点评

嗯。多谢。 主要是计划采用,尚未定型,不想牵涉到代理商之类。 原本期望在官网能解决疑问的。没答案才在各论坛里查证。  详情 回复 发表于 2016-2-24 16:55
 
个人签名

So TM what......?

 

 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

12
 
ljj3166 发表于 2016-2-24 16:05
第二点可以自己试验一下
同时最好能够与FAE联系确认

嗯。多谢。
主要是计划采用,尚未定型,不想牵涉到代理商之类。
原本期望在官网能解决疑问的。没答案才在各论坛里查证。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

13
 
楼主你好,我打算用SAMD20在项目中,遇到个问题:
  用ASF CLOCK_QUICK_START_CLOCK1,  48MHz, 加入了UART
   UART输出EDBG,115200波特率,但是电脑的串口助手显示老是乱码
谢谢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表