微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何制作一个数组将数据发送到AVR中的从机

如何解决如何制作一个数组将数据发送到AVR中的从机

我正在研究 AVR 以学习它。我的代码工作正常。意味着它给了我想要的输出,但我想修改代码。我做了 4 个函数来将数据发送到从站。就像在我要发送的代码中一样 61,62,63,64。但对于这些,我做了 four functions。现在我想修改它,因为所有数据都由 one function 发送到药膏。所以我的代码行会减少。其次,我希望一旦 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();
        }}

解决方法

只需使用第一个功能。其他的只是一个副本,都是一样的,没有必要。

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];,但这并不意味着它将包含满容量的数据。因此,当数据写入数组时,必须进行计数并存储在变量中,以便在需要时知道该数组的实际长度。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。