原文来自:https://www.avrfreaks.net/comment/2236256

I'm writing code for an embedded chip that consists of an Atmega16U2 connected to two devices via the port B SPI pins and the Port D USART pins (which can be used for SPI comms as well).

I'm a bit confused: is the SPCR register a shared resource that will be used for communications to both my Port B and Port D SPI slaves?

Also, i'm a bit stuck on the nitty gritty of how to send data to a specific slave. Since I have two SS lines (DDD4 and DDB0) connected to the uC do I just bit shift one of them low and start calling my writeSPI() function? What would my readSPI() function look like?

C Code:

void SetupSPIHardware(void)
{
/* Set MOSI and SCK output, all others input */
DDRB = (1 << DDB2)|(1 << DDB1);
DDRD = (1 << DDD3)|(1 << DDD5);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR0);
} void writeSPI(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}
This topic has a solution. Jump to the solution.         
        Last Edited: Mon. Aug 7, 2017 - 05:26 PM     

Top      

                  Level: 10k+ Postman             
                  Joined: Thu. Dec 30, 2004             
                  Posts: 22041 View posts             
                  Location: Melbourne,Australia             
This reply has been marked as the solution.             #2
Posted by Kartman:                Sat. Aug 5, 2017 - 05:58 AM                                       
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 1

Why do you want to use both the spi and usart for the same thing? You can have a number of slaves on the one spi master, but they must have individual slave selects.

uint8_t SPI(uint8_t cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF))); return SPDR;
}

SPI needs to send a byte to receive a byte, so you really only need one function.

'bit shift' is not quite the right term. Basically if you want to talk to device #1, make it's SS pin low. Make it high when finished. Similarly for device #2, make it's SS pin low when you want to talk to it. High when finished.

Regarding SPI and USART - the SPDR register is NOT shared. The USART has it's own registers.

        Last Edited: Sat. Aug 5, 2017 - 06:01 AM     

Top      

                  Level: Raving Lunatic             
                  Joined: Fri. Aug 3, 2001             
                  Posts: 2802 View posts             
 
Posted by Paulvdh:                Sat. Aug 5, 2017 - 02:35 PM                                       
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0
The High Septon wrote:

Also, i'm a bit stuck on the nitty gritty of how to send data to a specific slave

Do some research and try some things before asking questions.

There surely are plenty datasheets, application notes, libs, examples, tutorials about SPI.

And then, when you get stuck, ask more specific questions.

There is even a tutorial about how to ask questions on a forum and why asking "help me" is not helping anybody.

Doing magic with a USD 7 Logic Analyser: https://www.avrfreaks.net/comment/2421756#comment-2421756

Bunch of old projects with AVR's: http://www.hoevendesign.com

Top      

awneil

 
                  Level: 10k+ Postman             
                  Joined: Fri. Jul 1, 2005             
                  Posts: 15843 View posts             
                  Location: Basingstoke, Hampshire, UK             
Posted by awneil:                Sat. Aug 5, 2017 - 03:11 PM                                       
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus#Independent_slave_configuration

Addendum - highlighting the different Slave-Select (SS) lines:

#SPISlaveSelect

Top Tips:

  1. How to properly post source code - see: https://www.avrfreaks.net/comment... - also how to properly include images/pictures
  2. "Garbage" characters on a serial terminal are (almost?) invariably due to wrong baud rate - see: https://learn.sparkfun.com/tutorials/serial-communication
  3. Wrong baud rate is usually due to not running at the speed you thought; check by blinking a LED to see if you get the speed you expected
  4. Difference between a crystal, and a crystal oscillatorhttps://www.avrfreaks.net/comment...
  5. When your question is resolved, mark the solution: https://www.avrfreaks.net/comment...
  6. Beginner's "Getting Started" tips: https://www.avrfreaks.net/comment...
        Last Edited: Sat. Aug 5, 2017 - 03:35 PM     

Top      

                  Level: Hangaround             
                  Joined: Thu. Feb 11, 2016             
                  Posts: 122 View posts             
 
Posted by The High Septon:                Sat. Aug 5, 2017 - 03:14 PM                                            (Reply to #2)                          
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Ah interesting, it sounds like I may have made a mistake in trying to utilize the USART pins for SPI, seems like I don't want that after all.

Given my schematic below you will see that i've connected my CAP1188 slave to the PORT D USART pins that also support Master SPI Mode. If I was to simplify my design I would connect the MISO/MOSI/SCK lines at PD2,3,5 to those SPI pins on PortB. I'm a little confused though; what line would be good for my CAP1188s SS? Could I just choose any digital I/O pin?

Top      

                  Level: Hangaround             
                  Joined: Thu. Feb 11, 2016             
                  Posts: 122 View posts             
 
Posted by The High Septon:                Sat. Aug 5, 2017 - 03:15 PM                                       
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0
Paulvdh wrote:

The High Septon wrote:

Also, i'm a bit stuck on the nitty gritty of how to send data to a specific slave

Do some research and try some things before asking questions.

There surely are plenty datasheets, application notes, libs, examples, tutorials about SPI.

And then, when you get stuck, ask more specific questions.

There is even a tutorial about how to ask questions on a forum and why asking "help me" is not helping anybody.

That's why I didn't say "help me"... I gave a very clear question with background explanation and a code example. Relax dude.

        Last Edited: Sat. Aug 5, 2017 - 05:31 PM

Communicating to 2 SPI Slaves with USART & SPI ports on Atmega16U2的更多相关文章

  1. ARM与FPGA通过spi通信设计2.spi master的实现

    这里主要放两个代码第一个是正常的不使用状态机的SPI主机代码:第二个是状态机SPI代码 1.不使用状态机:特权同学<深入浅出玩转FPGA>中DIY数码相框部分代码: /////////// ...

  2. ARM与FPGA通过spi通信设计1.spi基础知识

    SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息.SPI总线可直接与各个厂家生产 ...

  3. dubbo源码分析2——SPI机制中的SPI实现类的读取和预处理

    SPI机制中的SPI实现类的读取和预处理是由ExtensionLoader类的loadFile方法来完成的 loadFile方法的作用是读取dubbo的某个SPI接口的spi描述文件,然后进行缓存,缓 ...

  4. Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)

    一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...

  5. UART,USART,SPI,I2C等总线的介绍与区别20160526

    首先来说一下UART和USART的区别: 1.字面意义: UART:universal asynchronous receiver and transmitter通用异步收发器: USART:univ ...

  6. 使用STM32的USART的同步模式Synchronous调戏SPI[2] 【实现spi 9bit】

    [原创出品§转载请注明出处] 出处:http://www.cnblogs.com/libra13179/p/7064533.html 上回说道使用USART的来模拟SPI通讯.说说一下我什么写这个的原 ...

  7. SPI总线协议及SPI时序图详解

    SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚 ...

  8. [SPI&I2C]I2C和SPI协议介绍

    IIC vs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身 ...

  9. spi数据KL25用SPI操作nor flash

    最近研究spi数据,稍微总结一下,以后继续补充: KL25的SPI连接一个nor flash.该flash型号为FM25F04,支撑SPI的模式0和模式3,要求高位先发送,在上升沿采集数据. 通常,S ...

随机推荐

  1. .net core学习笔记,组件篇:服务的注册与发现(Consul)初篇

    1.什么是服务注册中心? 在学习服务注册与发现时,我们要先搞明白到底什么是服务注册与发现. 在这里我举一个生活中非常普遍的例子——网购来简单说明,网购在我们日常生活中已经是非常普遍了,其实网购中的(商 ...

  2. 关于js中循环遍历中顺序执行ajax的问题(vue)

    js里的循环,每次都是自顾自的走,它不等ajax执行好走完到success代码,就继续循环下一条数据了,这样数据就全乱了. 后来,想到试试ajax里async这个属性,async默认是true,即为异 ...

  3. 【Android】安卓开发之activity如何传值到fragment,activity与fragment传值

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 大家知道,我们利用activity使 ...

  4. TextBox控件保存上次的输入

    本片文章是参考C# 怎么让winform程序中的输入文本框保留上次的输入再此表示感谢重新在这里写一遍,是为了保存一下,方便自己下次使用可以很快的找到1.设置txtBox控件的配置文件2.选择Text ...

  5. Spine学习一 -渲染组件

    一共有四个播放的组件: SkeletonAnimation:有点儿类似于 unity的 Animation,挂上一个spine资源,就可以跑了 SkeletonRenderer:SkeletonAni ...

  6. 剑指 Offer 19. 正则表达式匹配

    题目描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  7. Linux 用户与权限

    这些天一直在看Linux的命令但是却没有写文章,因为感觉没有必要,哪些简单的命令,vi cat cd 啥的,是个做开发的就知道,所以就没写; 用户管理 第一个我们知道的用户就是Root 没错哦,这就是 ...

  8. leetcode刷题-62不同路径

    题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问总 ...

  9. “未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决方案

    不论是连接Access数据库或是SQL Server数据库,"未在本地计算机上注册"Microsoft.ACE.OLEDB.12.0"提供程序."这个问题从Of ...

  10. WebSphere MQ常用命令及配置

    WebSphere MQ常用命令及配置 (2012-06-23 23:09:16) 标签: mq命令 杂谈 分类: MQ [导读]WebSphere MQ常用命令及配置 一,队列管理命令 1,创建队列 ...