完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
第一次使用128进行双机通讯,多有不懂,请大侠指教!!!
说明:我的双机通讯主机使用主机发送一个数据,如0x7E;从机采用中断接收,从机判断接受到0x7E后则点亮,但是问题来了,无论主机发送什么数据,虽然从机中断接收时可以的,就是从机 //SPI中断服务子程序 ISR(SPI_STC_vect) { INT8U data; data= SPI_Receive(); if(data==0x7E) 这里为什么没起作用,就是无论接受到0X01,0X7C,下面的 PORTD = 0xFC; // 语句都会执行,且点亮相关的灯,相应的proteus仿真附图,望高手指正,在下感激不尽~!!! { PORTD = 0xFC; // } PORTD^=_BV(PD0); _delay_ms(500); } 主机程序: #define F_CPU 4000000UL #include #include #include til/delay.h> //端口初始化 void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; PORTE = 0x00; DDRE = 0x00; PORTF = 0x00; DDRF = 0x00; PORTG = 0x00; DDRG = 0x00; } //SPI总线初始化 void spi_init(void) { SPCR = 0x70; //fosc/8 SPSR = 0x00; //2倍 DDRB=0X07; PORTB|=0X08; } //ATmega128初始化代码 void init_devices(void) { cli(); port_init(); spi_init(); sei(); DDRA=0XFF; //设置PA端口为输出 } //SPI总线数据发送函数 void SPI_Transmit(char cData) { // 启动数据传输 SPDR = cData; //等待传输结束 while(!(SPSR & (1< } //SPI总线数据接收函数 unsigned char SPI_Receive(void) { //等待接收结束 while(!(SPSR & (1< // 返回数据 return SPDR; } int main() { unsigned char i; init_devices(); _delay_ms(100); //延时1ms SPI_Transmit(0x7E); while(1) { for(i=255;i>0;i--) //循环发送 { //SPI_Transmit(i); _delay_ms(100); //延时 PORTA^=_BV(PA6); PORTA &=~ (_BV(PA7)); } } } 从机部分: #define F_CPU 4000000UL #include #include #include #define INT8U unsigned char #define INT16U unsigned int unsigned char temp; //用于存放接收到的数据 //端口初始化 void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x0B; //SPI引脚方向 PORTC = 0x00; DDRC = 0x00; //PORTD = 0x00; //DDRD = 0x00; PORTE = 0x00; DDRE = 0x00; PORTF = 0x00; DDRF = 0x00; PORTG = 0x00; DDRG = 0x00; DDRD=0xFF; //设置PA端口为输出 } //SPI数据发送函数 void SPI_Transmit(char cData) { // 启动数据传输 SPDR = cData; //等待传输结束 while(!(SPSR & (1< } //SPI数据接收函数 unsigned char SPI_Receive(void) { //等待接收结束 while(!(SPSR & (1< // 返回数据 return SPDR; } //SPI初始化函数 void spi_init(void) { SPCR = 0xE0; //从机工作模式 SPSR = 0x00; //清除 } //SPI中断服务子程序 ISR(SPI_STC_vect) { INT8U data; data= SPI_Receive(); if(data==0x7E) { PORTD = 0xFC; // } PORTD^=_BV(PD0); _delay_ms(500); } //UART0初始化 /*void uart0_init(void) { UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C = 0x06; UBRR0L = 0x33; //set baud rate lo UBRR0H = 0x00; //set baud rate hi UCSR0B = 0x98; } //初始化ATmega128 void init_devices(void) { cli(); port_init(); spi_init(); // uart0_init(); sei(); } int main() { // unsigned char temp=0x01; init_devices(); while(1) { } }
|
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5140 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7774 浏览 0 评论
3038 浏览 2 评论
3111 浏览 1 评论
10068 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 03:43 , Processed in 0.676791 second(s), Total 67, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号