计算机串口接spi,串口和SPI口来控制16位DA的简单程序

这是一个通过串口来发送16位数据给SIP口来控制DA输出,我是个新手,刚开始编不久,最近写的这个程序,可能有错,请高手能指点下。

//ICC-AVR application builder : 2007-1-4 20:12:16

// Target : M16

// Crystal: 8.0000Mhz

#include

#include

#include

#define SIZE 100

void port_init(void);//端口初始化函数

void uart0_init(void);//M16串口初始化函数

void spi_init(void);//SPI端口初始化函数

void spi_stc_isr(void);//SPI端口中断函数

void init_devices(void);//整个设备初始化函数

void delay_1ms(void);//延时1ms程序

void delay(unsigned int n);//延时n毫秒程序

void putchar(unsigned char c); //字符输出函数

void puts(unsigned char *s);//字符串输出函数

void uart0_rx_isr(void);//串口接收中断函数

void chose_da(char);//DA选择函数

void trans_SPI(char DATA3);//SPI口的输出函数

unsigned char URX_data=0;//接收到数据

unsigned char SPI_rx_buffer[SIZE]; //SPI接收数据缓冲区

unsigned char SPI_tx_buffer[SIZE]; //SPI发送数据缓冲区

unsigned char rx_wr_index, rx_rd_index, rx_counter, rx_buffer_overflow;

unsigned char tx_wr_index ,tx_rd_index, tx_counter, SPI_ok;

void port_init(void)                 //端口初始化函数

{

PORTA = 0x00;

DDRA  = 0x1F;

PORTB = 0x00;

DDRB  = 0x00;

PORTC = 0x00; //m103 output only

DDRC  = 0x00;

PORTD = 0x00;

DDRD  = 0x00;

}

void uart0_init(void)                //M16串口初始化函数

{

UCSRB = 0x00; // 设置波特率前关闭中断

UCSRA = 0x00;

UCSRC = BIT(URSEL) | 0x06;//异步模式,1位停止位,8位数据位,baud rate: 9600,无校验,baud rate:9615 (0.2%)

UBRRL = 0x33; //set baud rate lo

UBRRH = 0x00; //set baud rate hi

UCSRB = 0x98; //发送允许、接收允许、接收中断允许

}

void spi_init(void)   //SPI端口初始化函数

{

unsigned char temp;

DDRB |= 0x080;    //MISO=input and MOSI,SCK,SS = output

PORTB |= 0x80;    //MISO上拉电阻有效

SPCR = 0xD5;    //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率

SPSR = 0x00;

temp = SPSR;

temp = SPDR;    //清空SPI,和中断标志,使SPI空闲

SPI_ok = 1;

}

#pragma interrupt_handler spi_stc_isr:11

void spi_stc_isr(void)   //SPI中断函数

{

SPI_rx_buffer[rx_wr_index] = SPDR;    //从ISP口读出收到的字节

SPI_ok = 1;                         // SPI 空闲

if (++rx_wr_index == SIZE) rx_wr_index = 0;    //放入接收缓冲区,并调整队列指针

if (++rx_counter == SIZE)

{

rx_counter = 0;

rx_buffer_overflow = 1;

}

if (tx_counter)        //如果发送缓冲区中有待发的数据

{

--tx_counter;

SPDR = SPI_tx_buffer[tx_rd_index]; //发送一个字节数据,并调整指针

if (++tx_rd_index == SIZE) tx_rd_index = 0;

SPI_ok = 0;

}

}

unsigned char getSPIchar(void)  //SPI接收字节函数

{

unsigned char data;

while (rx_counter == 0);     //无接收数据,等待

data = SPI_rx_buffer[rx_rd_index];    //从接收缓冲区取出一个SPI收到的数据

if (++rx_rd_index == SIZE) rx_rd_index = 0;    //调整指针

CLI();

--rx_counter;

SEI();

return data;

}

void putSPIchar(char c)     //SPI发送字节函数

{

while (tx_counter == SIZE);//发送缓冲区满,等待

CLI();

if (tx_counter || SPI_ok==0 )      //发送缓冲区已中有待发数据

{                //或SPI正在发送数据时

SPI_tx_buffer[tx_wr_index] = c;    //将数据放入发送缓冲区排队

if (++tx_wr_index == SIZE) tx_wr_index = 0;    //调整指针

++tx_counter;

}

else

{

SPDR = c;        //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送

SPI_ok = 0;      //

}

SEI();

}

void init_devices(void)             //整个设备初始化函数

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

spi_init();

uart0_init();

MCUCR = 0x00;

GICR  = 0x00;

TIMSK = 0x00; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

void delay_1ms(void)                //延时1ms程序

{

unsigned int i;

for(i=1;i

}

void delay(unsigned int n)           //延时n毫秒程序

{

unsigned int  i=0;

for(i=0;i

delay_1ms();

}

void putchar(unsigned char c)        //字符输出函数

{

while (!(UCSRA&(1 << UDRE)));//判断上次发送有没有完成

UDR = c;

}

void puts(unsigned char *s)         //字符串输出函数

{

while (*s)

{

putchar(*s);

s++;

}

}

#pragma interrupt_handler uart0_rx_isr:12

void uart0_rx_isr(void)           //串口接收中断函数

{

URX_data = UDR;

}

void main(void)

{

unsigned int dadata=0;//传送给SPI口的16位数据变量

unsigned char dacl=0;//传送的低8位数据

unsigned char dach=0;//传送的高8位数据

unsigned char DATA1=0;

init_devices();

SEI();        //开中断

while (1)

{

if ((URX_data&0xFF)==0x02)//关闭DA

{

PORTA=0x00;

puts("STOP_DA");

}

else if((URX_data&0xFF)==0x01)//复位DA

{

PORTA=0x01; //A40口输出低电平使DA复位

delay_1ms();

PORTA=0x00; //A40口输出高电平结束DA复位

puts("RSET_DA");

}

else //DA开始应用

{

puts("STAR_DA");

dacl=URX_data;//取低字节

dach=URX_data;//取高字节

putSPIchar(dacl);

putSPIchar(dach);

}

}

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FPGA是一种可以编程的逻辑器件,可以用来实现各种数字电路的功能。SPI是一种通信协议,用于在数字系统之间或与外围器件之间进行串行通信。FPGA可以通过SPI口和其他数字器件进行通信,实现数据的传输和控制。 FPGA中集成的硬件资源可以用于实现SPI口的控制逻辑和数据传输。FPGA可以配置成SPI主设备或从设备,在通信中发送和收数据。SPI协议包含时钟和数据线,FPGA可以通过时钟信号进行同步,并通过数据线发送和收数据。 使用FPGA实现SPI口具有很多优点。首先,FPGA具有高度的可编程性和灵活性,可以实现各种不同的SPI口,并可根据需要进行修改和优化。其次,FPGA具有高速的运算能力和低延迟,可以实现高速SPI通信。最后,使用FPGA可以将SPI口和其他数字逻辑功能集成在一起,从而简化系统设计,提高系统效率和可靠性。 总之,FPGA和SPI是数字电路设计中常用的工具,结合使用可以实现高效、灵活和可靠的系统设计。 ### 回答2: FPGA是一种可编程逻辑器件,可以按照用户的需求进行编程来实现特定功能。SPI则是串行外设口的一种,用于芯片之间的通信。FPGA可以通过使用SPI口来与其他芯片进行通信,SPI口可以实现完全双向的数据传输,允许FPGA作为主设备来向从设备发送数据,并且从设备也可以将数据发送回FPGA。此外,SPI口还具有多主多从的特性,因此可以连多个从设备,也可以有多个主设备来完成数据传输。 在FPGA中使用SPI,需要编写SPI口的驱动程序控制数据的发送和收。由于FPGA可以根据需求进行编程,因此可以通过编写SPI驱动程序来定制通信协议和传输速率,以满足特定应用的需求。SPI口的传输速率通常较快,因此可以在需要高速通信的应用程序中发挥重要作用。 总的来说,FPGA和SPI是两个非常有用的工具,可以在许多不同的应用程序中使用。通过将SPI口与FPGA结合起来,可以实现高速、高效的数据传输,从而为许多应用程序提供更好的性能和功能。 ### 回答3: FPGA是可编程逻辑门阵列,它在数字电路实现中非常常见。它可以在硬件级别上实现数字逻辑电路,因此可以用于高速、高效的数字信号处理、视频处理、通信、图像处理和控制等应用中。SPI是一种同步串行通信口协议,它被用于连控制器和其他外设,如传感器、存储器等。作为一种通信协议,SPI具有高速的通信速率、简单的通信协议和松散的主从模式等优点。 FPGA集成了硬件编程和逻辑实现的优点,可以实现高效率的数字处理,同时支持多种通信协议口,如SPI、I2C、UART等。因此,FPGA可以用于实现高速数据处理和通信的应用场景。在这些应用中,SPI被广泛用于连外设。FPGA通过SPI口可以与其他器件进行通信,读取或写入需要的数据。 总之,FPGA和SPI都是在数字电路和通信领域中广泛应用的技术。FPGA具有高效的数字处理和多种通信口的优势,而SPI则是连控制器和外设的常用协议。他们的联合使用可以在数字处理和通信方面带来更好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值