如何制作一个数组以将数据发送到 AVR 中的从机
Posted
技术标签:
【中文标题】如何制作一个数组以将数据发送到 AVR 中的从机【英文标题】:How to make an array to send the data to slave in AVR 【发布时间】:2021-10-01 19:07:25 【问题描述】:我正在开发 AVR 来学习它。我的代码工作正常。意思是它给了我想要的输出,但我想修改代码。我做了 4 个函数来将数据发送到从站。就像在我要发送61,62,63,64
的代码中一样。但对于这些,我制作four functions
。现在我想修改它,因为所有数据都由one function
发送到salve。所以我的代码行会减少。其次,我希望一旦 61 发送到药膏,它会打印出类似 datatransfered
的内容,而一旦 dataexchange
是 display **exchanged**
。我试着做数组,一个一个取数字,但很不幸。
#include <xc.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
void SPI0_init(void);
void LTCSelect(void);
void LTCDeselect(void);
uint8_t SPI0_exchangeData(uint8_t data);
uint8_t SPI1_exchangeData(uint8_t data1);
uint8_t SPI2_exchangeData(uint8_t data2);
uint8_t SPI3_exchangeData(uint8_t data3);
void SPI0_init(void)
PORTA.DIR |= PIN4_bm; /* Set MOSI pin direction to output (output to LTC2983) */
PORTA.DIR &= ~PIN5_bm; /* Set MISO pin direction to input (input form LTC2983) */
PORTA.DIR |= PIN6_bm; /* Set SCK pin direction to output (output to LTC2983) */
PORTA.DIR |= PIN7_bm; /* Set CS pin direction to output (output to LTC2983) */
SPI0.CTRLA = SPI_CLK2X_bm /* Enable double-speed */
| SPI_DORD_bm /* LSB is transmitted first */
| SPI_ENABLE_bm /* Enable module */
| SPI_MASTER_bm /* SPI module in Master mode */
| SPI_PRESC_DIV16_gc; /* System Clock divided by 16 */
uint8_t SPI0_exchangeData(uint8_t data)
SPI0.DATA = data;
while (!(SPI0.INTFLAGS & SPI_IF_bm)) /* waits until data is exchanged*/
return SPI0.DATA;
uint8_t SPI1_exchangeData(uint8_t data1)
SPI0.DATA = data1;
while (!(SPI0.INTFLAGS & SPI_IF_bm)) /* waits until data is exchanged*/
return SPI0.DATA;
uint8_t SPI2_exchangeData(uint8_t data2)
SPI0.DATA = data2;
while (!(SPI0.INTFLAGS & SPI_IF_bm)) /* waits until data is exchanged*/
return SPI0.DATA;
uint8_t SPI3_exchangeData(uint8_t data3)
SPI0.DATA = data3;
while (!(SPI0.INTFLAGS & SPI_IF_bm)) /* waits until data is exchanged*/
return SPI0.DATA;
void LTCSelect(void)
PORTA.OUT &= ~PIN7_bm; // Set SS pin value to LOW
void LTCDeselect(void)
PORTA.OUT |= PIN7_bm; // Set SS pin value to HIGH
int main(void)
uint8_t data = 61;
uint8_t data1 = 62;
uint8_t data2 = 63;
uint8_t data3 = 64;
SPI0_init();
while(1)
LTCSelect();
SPI0_exchangeData(data);
SPI1_exchangeData(data1);
SPI2_exchangeData(data2);
SPI3_exchangeData(data3);
LTCDeselect();
【问题讨论】:
【参考方案1】:只需使用第一个功能。其他的只是一个副本,都是一样的,没必要。
uint8_t SPI0_exchangeData(uint8_t data)
SPI0.DATA = data;
while (!(SPI0.INTFLAGS & SPI_IF_bm)) /* waits until data is exchanged*/
return SPI0.DATA;
并在您的主循环中调用相同的函数来发送您的所有数据:
int main(void)
uint8_t data = 61;
uint8_t data1 = 62;
uint8_t data2 = 63;
uint8_t data3 = 64;
SPI0_init();
while(1)
LTCSelect();
SPI0_exchangeData(data);
SPI0_exchangeData(data1);
SPI0_exchangeData(data2);
SPI0_exchangeData(data3);
LTCDeselect();
你应该在你的从设备中分别有你的号码。
发送数组更新
/**
* Sends an uint8_t array to SPI0
*
* Here we send an array of uint8_t (aka unsigned char) to SPI0 one by one.
* using the length parameter and an index variable.
*
* @param data a data array to send to SPI0.
* @param length the length of the given array.
* @returns nothing, but you can return any util info if you wish
*/
void sendArray(uint8_t data[], uint8_t length)
for(uint8_t i = 0; i < length; i++)
SPI0_exchangeData(data[i]);
// Suppose we have an array named buffer
uint8_t buffer[] = 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ;
// Some where in the main loop we want to send it to the SPI0
int main(void)
//...
while(1)
//...
// We pass the array and its length in this way
sendArray(buffer, sizeof(buffer));
return 0;
请注意,数组是静态定义和分配的。在实际情况下,数组主要用于静态分配的内存,比如 64 字节,即uint8_t buffer[64];
,但这并不意味着它将包含全部容量的数据。因此,当数据写入数组时,必须计算并存储在变量中,以便在需要时知道该数组的实际长度。
【讨论】:
好的。但是我怎样才能在这个中传递一个数组。就像现在我只有 4 个号码,如果我有更多设备和更多数据,这是一个很好的解决方案。 别担心,很容易我会更新数组实现的答案。 以及打印我尝试过 printf 但它不起作用的任何可能性 好的,单独发一个问题,解释清楚你的问题,看看是什么问题。以上是关于如何制作一个数组以将数据发送到 AVR 中的从机的主要内容,如果未能解决你的问题,请参考以下文章
avr单片机中spi通信 要取从机的数据,从机数据在啥时候写入SPDR寄存器?最好有例子。