如何制作一个数组以将数据发送到 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 的内容,而一旦 dataexchangedisplay **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寄存器?最好有例子。

SPI怎么区分主从? 两个设备之间通过SPI连接,根据啥来定义主从?

如何使用复选框制作一个赞按钮以将随机生成的引号存储到数组中

单片机MODBUS RTU 作主机C程序

STM32IIC接收到的数据都是0x40怎么办

PDO:获取类选项以将字段作为数组发送到构造函数