Atmega128 + CH376串口方式问题记录

本文记录了在Atmega128上使用CH376进行串口通信时遇到的困难,主要问题是数据交换过程中返回错误码0x3A,导致后续操作失败。经过查阅资料和与厂家技术支持沟通,发现需要清除128的串口缓存。在C51中通常使用TI和RI标志位,但在Atmega128中,通过设置RXENn标志位为0来刷新接收缓冲器,解决了问题。这一解决方案使得整个串口通信恢复正常。
摘要由CSDN通过智能技术生成

最近在mega128上调试CH376, 用串口方式不要问什么,节省资源

经过将近一周时间,终于调试成功,这里记录一下过程中出现的一个很头疼的问题。  

过程大概是这样, 首先初始化376,接着通过中断(376自带的 INT0 中断管脚)等待U盘插入(我这里主要是管理U盘的数据),然后检查磁盘状态------检测磁盘就绪 

接着就是就是数据交换过程~~检测磁盘剩余容量

再往下进行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ATmega128是AVR系列的微处理器,它可以使用Bootloader程序进行固件更新。Bootloader程序是一种特殊的程序,允许用户通过串口(或其他接口)将新的固件上传到芯片中,而无需使用专用的编程器。 以下是使用AVR-GCC编译器和AVRDUDE工具链编写的ATmega128 Bootloader程序示例: ```c #include <avr/io.h> #include <avr/interrupt.h> #include <avr/boot.h> #define F_CPU 16000000UL #define BAUD 19200 #define MYUBRR F_CPU/16/BAUD-1 void USART_Init(unsigned int ubrr) { UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char)ubrr; UCSR0B = (1<<TXEN0)|(1<<RXEN0); UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); } void USART_Transmit(unsigned char data) { while (!(UCSR0A & (1<<UDRE0))); UDR0 = data; } unsigned char USART_Receive(void) { while (!(UCSR0A & (1<<RXC0))); return UDR0; } void USART_putstring(char* string) { while (*string) { USART_Transmit(*string++); } } void bootloader() { void (*app_start)(void) = 0x0000; unsigned char ch; unsigned char *bufptr; unsigned int address = 0; unsigned char pagebuffer[SPM_PAGESIZE]; USART_Init(MYUBRR); USART_putstring("Bootloader started!\n"); do { ch = USART_Receive(); switch (ch) { case 'a': // Get bootloader version USART_putstring("Bootloader version 1.0\n"); break; case 'b': // Read byte from flash address = USART_Receive() | (USART_Receive()<<8); USART_Transmit(pgm_read_byte_near(address)); break; case 'c': // Write byte to flash address = USART_Receive() | (USART_Receive()<<8); bufptr = pagebuffer; *bufptr++ = USART_Receive(); boot_page_erase(address); boot_spm_busy_wait(); boot_page_fill(address, *pagebuffer); boot_page_write(address); boot_spm_busy_wait(); USART_putstring("Byte written!\n"); break; case 'd': // Jump to application USART_putstring("Jumping to application...\n"); app_start(); break; default: break; } } while (1); } int main(void) { bootloader(); return 0; } ``` 这个示例程序实现了一个简单的Bootloader,通过串口与用户进行交互,实现读取、写入和跳转到应用程序的功能。在这个示例中,我们使用AVRDUDE工具将新的固件上传到芯片中。上传的固件应该是一个可执行程序,它将被存储在ATmega128芯片的Flash存储器中,并在跳转到应用程序之前被验证。 请注意,这只是一个简单的示例程序,实际的Bootloader程序可能需要更复杂的功能和更多的错误处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值