如何编写代码以通过 SPI 主机将数据从内部存储器传输到 2 个从机
Posted
技术标签:
【中文标题】如何编写代码以通过 SPI 主机将数据从内部存储器传输到 2 个从机【英文标题】:how to write code for transfer data from internal memory via SPI Master to 2 slave 【发布时间】:2015-06-05 09:12:46 【问题描述】:我从 USB 接收数据到 Atxmega 128A1 的内部存储器
if ( (SWITCHPORTL.IN & PIN1_bm) == 0 )
j = 0;
while (j < NUM_BYTES)
// Wait till there is unread data in the receive buffer
while((USART.STATUS & USART_RXCIF_bm) == 0 );
// Read out the received data
__far_mem_write(j+SDRAM_ADDR, USART.DATA);
if (j == (NUM_BYTES-1))
// Toggle LED 1
LEDPORT.OUTTGL = PIN1_bm;
j++;
如何编写代码通过 SPI 主机将数据从内部存储器传输到两个从机,以便奇偶字节数据应分别发送到两个从机?如何启动master到两个slave(多个slave)?
【问题讨论】:
这在很大程度上取决于从站所需的帧格式。你必须阅读数据手册。如果您对代码有任何具体问题,请回来。 @Olaf 对不起...我必须发布方法。但由于我是新来的,所以无法以编码方式发布。你能帮帮我吗 获取tour。你在这里的时间比我长。 @Olaf 很好。没有论据。对造成的不便表示歉意。我找不到正确的方法。 :( 【参考方案1】:我认为这在大多数情况下都是可能的,因为两个从站都可以理解类似格式的数据,例如 CPOL 和 CPHA 具有相同的配置。您可以通过分别启用 CS 引脚来选择一个特定的从机。因此,您的代码可能如下所示:
initMaster();
selectSlave1(); //Make CS1 low and CS2 high
spiTransmit(data1); //transmit odd byte
selectSlave2(); //Make CS2 low and CS1 high
spiTransmit(data2); //transmit even byte
【讨论】:
可能不起作用,因为在您切换选择的那一刻,SPI 很可能仍在忙于转换。此外,您必须在两者之间处理接收到的数据。此外:一旦您选择了 Slave2,您将同时选择激活(除非selectSlave2()
暗示“取消选择从站 1”)。另外:如果设备在数据之前需要地址怎么办?哪种格式? ... 需要数据表(但这对本网站来说太过分了)。
- 我通常实现 spiTransmit() 来确保发送完成,通过检查这个标志:while(!(SPSR & (1
我认为这个问题只涉及 SPI 上的多路复用,用于 2 个不同的从站,这似乎是可行的。您可能只需要单独配置它们,等待初始化完成,然后只需发送一个字节并移动到另一个字节。
@Olaf 我是否应该设置第一个从属设备并从内部存储器读取偶数字节到第一个从属设备,然后强制第一个从属设备停用。进一步启动第二个从站并重复相同的操作?
@SijoJohn,请理解这不是教程网站,我不能在这里进行培训。【参考方案2】:
由于两个从站都连接到同一总线,一次只能传输一个数据,因此您有两个选项可供选择:
-
实现一个简单的协议,以便每个从站都知道哪个字节属于它。 (示例:一个字节头,6 位长度和 2 位接收器代码或(1 - 从机 1,2 从机 2 - 3 均从机偶数/奇数)
使用从机选择引脚并传输一个字节,并确保在发送旧的接收器之前不发送下一个并取消选择第一个接收器(计算时钟周期需要多长时间和
nop
它们或将它们用于其他有用的东西))
【讨论】:
以上是关于如何编写代码以通过 SPI 主机将数据从内部存储器传输到 2 个从机的主要内容,如果未能解决你的问题,请参考以下文章
avr单片机中spi通信 要取从机的数据,从机数据在啥时候写入SPDR寄存器?最好有例子。