G
Guest
Guest
我想外部数据存储器接口与atmega 16 。为此
, 我选择的MMC
, 因为它的代码已书面和在网上。该代码是。
/*********************************************
*芯片类型: ATmega16
*时钟频率: 2457600Hz
*********************************************/
#包括<avr/io.h>
#包括<avr/interrupt.h>
#包括<avr/signal.h>
#包括<inttypes.h>
#包括<avr/iom16.h>
#定义F_OSC 2457600 / *振荡器频率赫兹* /
#定义UART_BAUD_RATE 9600
#定义UART_BAUD_CALC ( UART_BAUD_RATE , F_OSC ) ( ( F_OSC ) / ( ( UART_BAUD_RATE ) *一十六升) -1 )
#定义SPIDI 6 / /端口B位6 ( pin7 ) :数据(数据来自MMC )
中#定义SPIDO 5 / /端口B位5 ( pin6 ) :数据(数据MMC )
中#定义SPICLK 7 / /端口B位7 ( pin8 ) :时钟
#定义SPICS 4 / /端口B位4 ( pin5 :芯片选择的MMC
焦部门[ 512 ] ;
无效delay_ms (无符号短毫秒) (
无符号短outer1 , outer2 ;
outer1 = 200 ;
而( outer1 ) (
outer2 = 1000 ;
而( outer2 ) (
而(
MS )
的 女士- ;
outer2 - ;
)
outer1 - ;
)
)
无效usart_putc (无符号字符三) (
/ /等到尿嘧啶核苷准备
而( ! ( UCSRA & ( 1 “ ” UDRE ) ) ) ;
尿嘧啶核苷=
C的 ; / /发送字符
)
无效uart_puts (字符*县) (
/ /循环播放
, 直到* s频宽
; =空
而( *县) (
usart_putc ( *县) ;
县 ;
)
)
无效的init (无效) (
/ /设置波特率
UBRRH = ( uint8_t ) ( UART_BAUD_CALC ( UART_BAUD_RATE , F_OSC ) “ ”
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="凉爽的" border="0" />
;
UBRRL = ( uint8_t ) UART_BAUD_CALC ( UART_BAUD_RATE , F_OSC ) ;
/ /启用接收器和发射器;使接收中断
UCSRB = ( 1 “ ” RXEN ) | ( 1 “ ” TXEN ) | ( 1 “ ” RXCIE ) ;
/ /异步8N1
UCSRC = ( 1 “ ” URSEL ) | ( 3 “ ” UCSZ0 ) ;
)
/ /中断可中断
/ /信号不能打断
信号( SIG_UART_RECV ) ( / / USART接收中断
无符号字符,
丙型 ;
ç =尿嘧啶核苷;
usart_putc (
c )
段 ;
)
无效serialterminate (无效) ( / /终止发送字符串!
而( ! ( UCSRA & ( 1 “ ” UDRE ) ) ) ;
尿嘧啶核苷= 0x0d ;
而( ! ( UCSRA & ( 1 “ ” UDRE ) ) ) ;
尿嘧啶核苷= 0x0a ;
)
无效SPIinit (无效) (
DDRB & = 〜 ( 1 “ ” SPIDI ) ; / /设置端口B的SPI数据输入输入
DDRB | = ( 1 “ ” SPICLK ) ; / /设置端口B的SPI时钟输出
DDRB | = ( 1 “ ” SPIDO ) ; / /设置端口B的SPI数据输出
DDRB | = ( 1 “ ” SPICS ) ; / /设置端口B的SPI芯片选择输出
SPCR = ( 1 “ ”固相萃取) | ( 1 “ ” MSTR ) | ( 1 “ ” SPR1 ) | ( 1 “ ” SPR0 ) ;
PORTB & = 〜 ( 1 “ ” SPICS ) ; / /设置芯片选择低( MMC中选择)
)
焦炭的SPI (焦四) ( / /发送字符以上的SPI
焦收到= 0 ;
SPDR =
D的 ;
而( ! ( SPSR & ( 1 “ ” SPIF ) ) ) ;
收到= SPDR ;
返回(收到) ;
)焦司令部(焦befF , uint16_t AdrH , uint16_t AdrL ,焦炭befH )
( / /发送一个命令到MMC
的SPI ( 0xFF ) ;
的SPI ( befF ) ;
的SPI ( ( uint8_t ) ( AdrH “ ”
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="凉爽的" border="0" />
) ;
的SPI ( ( uint8_t ) AdrH ) ;
的SPI ( ( uint8_t ) ( AdrL “ ”
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="凉爽的" border="0" />
) ;
的SPI ( ( uint8_t ) AdrL ) ;
的SPI ( befH ) ;
的SPI ( 0xFF ) ;
返回的SPI ( 0xFF ) ; / /返回最后收到的性质
)
国际MMC_Init (无效) ( / /初始化的SPI
炭火一;
PORTB | = ( 1 “ ” SPICS ) ; / /禁用的MMC
/ /开始的MMC在SPI模式
(
一 = 0我“ 10 ,
我 )的SPI ( 0xFF ) ; / /发送10 * 8 = 80个时钟脉冲
PORTB & = 〜 ( 1 “ ” SPICS ) ; / /启用的MMC
如果(命令( 0x40 , 0,0,0 x95 ) ! = 1 )转到mmcerror ; / /重置的MMC
圣: / /如果没有MMC中,模块。循环这里
如果(命令( 0x41 , 0,0,0 xFF ) ! = 0 )转到圣;
返回1 ;
mmcerror :
返回0 ;
)
无效fillram (无效) ( / /填充内存部门的ASCII字符
诠释一,丙型;
焦mystring [ 18 ] = “队长在这里! ” ;
ç = 0 ;
(
一 = 0我“ = 512 ;一 ) (
部门[
1 ] = mystring [
C ]
条 ;
C
语言 ;
如果(
三 “ 17 ) ( ç = 0 ; )
)
)
国际writeramtommc (无效) ( / /写内存部门的MMC
诠释一;
uint8_t ,
丙型 ;
/ / 512字节写模式
如果(命令( 0x58 , 0,512,0 xFF ) ! = 0 ) (
uart_puts ( “ MMC中:写入错误1 ” ) ;
返回1 ;
)
的SPI ( 0xFF ) ;
的SPI ( 0xFF ) ;
的SPI ( 0xFE ) ;
/ /写内存部门的MMC
(
一 = 0我“ 512 ,
我 ) (
的SPI (部门[
1 ] ) ;
)
/ /结束时,派遣2哑字节
的SPI ( 0xFF ) ;
的SPI ( 0xFF ) ;
ç =的SPI ( 0xFF ) ;
统计= 0x1F ; / / 0x1F = 0b.0001.1111 ;
如果(
三 ! = 0x05 ) ( / / 0x05 = 0b.0000.0101
uart_puts ( “ MMC中:写入错误2 ” ) ;
返回1 ;
)
/ /等到MMC是不是忙了
而(的SPI ( 0xFF ) ! = (焦) 0xFF ) ;
返回0 ;
)
国际sendmmc (无效) ( / /发送512字节从MMC通过串口
诠释一;
/ / 512字节阅读模式
如果(命令( 0x51 , 0,512,0 xFF ) ! = 0 ) (
uart_puts ( “三菱:读取错误1 ” ) ;
返回1 ;
)
/ /等待0xFE -任何传输开始
/ /属性:定型(焦) 0xFE是必须!
而(的SPI ( 0xFF ) ! = (焦) 0xFE ) ;
(
一 = 0我“ 512 ,
我 ) (
而( ! ( UCSRA & ( 1 “ ” UDRE ) ) ) ; / /等待串口
尿嘧啶核苷=的SPI ( 0xFF ) ; / /发送字符
)
serialterminate ( ) ;
/ /结束时,派遣2哑字节
的SPI ( 0xFF ) ; / /实际上这个回报的CRC /校验字节
的SPI ( 0xFF ) ;
返回0 ;
)
国际主要(无效) (
的init ( ) ;
SPIinit ( ) ;
uart_puts ( “单片机在线” ) ;
serialterminate ( ) ;
MMC_Init ( ) ;
uart_puts ( “三菱在线” ) ;
serialterminate ( ) ;
世( ) ; / /使中断
fillram ( ) ;
writeramtommc ( ) ;
sendmmc ( ) ;
uart_puts ( “ 512字节发送” ) ;
serialterminate ( ) ;
uart_puts ( “ LED闪光现在” ) ;
serialterminate ( ) ;
/ /输出使PD5
DDRD | = ( 1 “ ” PD5 ) ;
而( 1 ) (
/ / PIN5 PORTD明确- “率先
PORTD & = 〜 ( 1 “ ” PD5 ) ;
delay_ms ( 500 ) ;
/ / PIN5 PORTD设置- “发光二极管
PORTD | = ( 1 “ ” PD5 ) ;
delay_ms ( 500 ) ;
)
返回0 ;
)
代码来源: http://www.captain.at/electronic-atmega-mmc.php
像interrupt.h的文件和其他文件包括令人不安我。我发现其中大多数是网络
, 但就是这些文件的代码而不是十六进制文件。当我尝试编译它们的十六进制文件,我codeVision显示太多的错误。请指导我该软件
, 我使用
, 使之成为一个十六进制文件
, 如果您有任何其他工作代码的MMC与ATMEGA 16或任何其他工作代码对外部存储器然后请员额代码。我使用的ATMEGA 16 。
<img src="http://www.edaboard.com/images/smiles/icon_neutral.gif" alt="中性" border="0" />#包括<avr/io.h>
#包括<avr/interrupt.h>
#包括<avr/signal.h>
#包括<inttypes.h>
#包括<avr/iom16.h>
如果你有这些文件后
, 请他们
, 因为我不知道
, 我的文件或不正确的。
, 我选择的MMC
, 因为它的代码已书面和在网上。该代码是。
/*********************************************
*芯片类型: ATmega16
*时钟频率: 2457600Hz
*********************************************/
#包括<avr/io.h>
#包括<avr/interrupt.h>
#包括<avr/signal.h>
#包括<inttypes.h>
#包括<avr/iom16.h>
#定义F_OSC 2457600 / *振荡器频率赫兹* /
#定义UART_BAUD_RATE 9600
#定义UART_BAUD_CALC ( UART_BAUD_RATE , F_OSC ) ( ( F_OSC ) / ( ( UART_BAUD_RATE ) *一十六升) -1 )
#定义SPIDI 6 / /端口B位6 ( pin7 ) :数据(数据来自MMC )
中#定义SPIDO 5 / /端口B位5 ( pin6 ) :数据(数据MMC )
中#定义SPICLK 7 / /端口B位7 ( pin8 ) :时钟
#定义SPICS 4 / /端口B位4 ( pin5 :芯片选择的MMC
焦部门[ 512 ] ;
无效delay_ms (无符号短毫秒) (
无符号短outer1 , outer2 ;
outer1 = 200 ;
而( outer1 ) (
outer2 = 1000 ;
而( outer2 ) (
而(
MS )
的 女士- ;
outer2 - ;
)
outer1 - ;
)
)
无效usart_putc (无符号字符三) (
/ /等到尿嘧啶核苷准备
而( ! ( UCSRA & ( 1 “ ” UDRE ) ) ) ;
尿嘧啶核苷=
C的 ; / /发送字符
)
无效uart_puts (字符*县) (
/ /循环播放
, 直到* s频宽
; =空
而( *县) (
usart_putc ( *县) ;
县 ;
)
)
无效的init (无效) (
/ /设置波特率
UBRRH = ( uint8_t ) ( UART_BAUD_CALC ( UART_BAUD_RATE , F_OSC ) “ ”
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="凉爽的" border="0" />
;
UBRRL = ( uint8_t ) UART_BAUD_CALC ( UART_BAUD_RATE , F_OSC ) ;
/ /启用接收器和发射器;使接收中断
UCSRB = ( 1 “ ” RXEN ) | ( 1 “ ” TXEN ) | ( 1 “ ” RXCIE ) ;
/ /异步8N1
UCSRC = ( 1 “ ” URSEL ) | ( 3 “ ” UCSZ0 ) ;
)
/ /中断可中断
/ /信号不能打断
信号( SIG_UART_RECV ) ( / / USART接收中断
无符号字符,
丙型 ;
ç =尿嘧啶核苷;
usart_putc (
c )
段 ;
)
无效serialterminate (无效) ( / /终止发送字符串!
而( ! ( UCSRA & ( 1 “ ” UDRE ) ) ) ;
尿嘧啶核苷= 0x0d ;
而( ! ( UCSRA & ( 1 “ ” UDRE ) ) ) ;
尿嘧啶核苷= 0x0a ;
)
无效SPIinit (无效) (
DDRB & = 〜 ( 1 “ ” SPIDI ) ; / /设置端口B的SPI数据输入输入
DDRB | = ( 1 “ ” SPICLK ) ; / /设置端口B的SPI时钟输出
DDRB | = ( 1 “ ” SPIDO ) ; / /设置端口B的SPI数据输出
DDRB | = ( 1 “ ” SPICS ) ; / /设置端口B的SPI芯片选择输出
SPCR = ( 1 “ ”固相萃取) | ( 1 “ ” MSTR ) | ( 1 “ ” SPR1 ) | ( 1 “ ” SPR0 ) ;
PORTB & = 〜 ( 1 “ ” SPICS ) ; / /设置芯片选择低( MMC中选择)
)
焦炭的SPI (焦四) ( / /发送字符以上的SPI
焦收到= 0 ;
SPDR =
D的 ;
而( ! ( SPSR & ( 1 “ ” SPIF ) ) ) ;
收到= SPDR ;
返回(收到) ;
)焦司令部(焦befF , uint16_t AdrH , uint16_t AdrL ,焦炭befH )
( / /发送一个命令到MMC
的SPI ( 0xFF ) ;
的SPI ( befF ) ;
的SPI ( ( uint8_t ) ( AdrH “ ”
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="凉爽的" border="0" />
) ;
的SPI ( ( uint8_t ) AdrH ) ;
的SPI ( ( uint8_t ) ( AdrL “ ”
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="凉爽的" border="0" />
) ;
的SPI ( ( uint8_t ) AdrL ) ;
的SPI ( befH ) ;
的SPI ( 0xFF ) ;
返回的SPI ( 0xFF ) ; / /返回最后收到的性质
)
国际MMC_Init (无效) ( / /初始化的SPI
炭火一;
PORTB | = ( 1 “ ” SPICS ) ; / /禁用的MMC
/ /开始的MMC在SPI模式
(
一 = 0我“ 10 ,
我 )的SPI ( 0xFF ) ; / /发送10 * 8 = 80个时钟脉冲
PORTB & = 〜 ( 1 “ ” SPICS ) ; / /启用的MMC
如果(命令( 0x40 , 0,0,0 x95 ) ! = 1 )转到mmcerror ; / /重置的MMC
圣: / /如果没有MMC中,模块。循环这里
如果(命令( 0x41 , 0,0,0 xFF ) ! = 0 )转到圣;
返回1 ;
mmcerror :
返回0 ;
)
无效fillram (无效) ( / /填充内存部门的ASCII字符
诠释一,丙型;
焦mystring [ 18 ] = “队长在这里! ” ;
ç = 0 ;
(
一 = 0我“ = 512 ;一 ) (
部门[
1 ] = mystring [
C ]
条 ;
C
语言 ;
如果(
三 “ 17 ) ( ç = 0 ; )
)
)
国际writeramtommc (无效) ( / /写内存部门的MMC
诠释一;
uint8_t ,
丙型 ;
/ / 512字节写模式
如果(命令( 0x58 , 0,512,0 xFF ) ! = 0 ) (
uart_puts ( “ MMC中:写入错误1 ” ) ;
返回1 ;
)
的SPI ( 0xFF ) ;
的SPI ( 0xFF ) ;
的SPI ( 0xFE ) ;
/ /写内存部门的MMC
(
一 = 0我“ 512 ,
我 ) (
的SPI (部门[
1 ] ) ;
)
/ /结束时,派遣2哑字节
的SPI ( 0xFF ) ;
的SPI ( 0xFF ) ;
ç =的SPI ( 0xFF ) ;
统计= 0x1F ; / / 0x1F = 0b.0001.1111 ;
如果(
三 ! = 0x05 ) ( / / 0x05 = 0b.0000.0101
uart_puts ( “ MMC中:写入错误2 ” ) ;
返回1 ;
)
/ /等到MMC是不是忙了
而(的SPI ( 0xFF ) ! = (焦) 0xFF ) ;
返回0 ;
)
国际sendmmc (无效) ( / /发送512字节从MMC通过串口
诠释一;
/ / 512字节阅读模式
如果(命令( 0x51 , 0,512,0 xFF ) ! = 0 ) (
uart_puts ( “三菱:读取错误1 ” ) ;
返回1 ;
)
/ /等待0xFE -任何传输开始
/ /属性:定型(焦) 0xFE是必须!
而(的SPI ( 0xFF ) ! = (焦) 0xFE ) ;
(
一 = 0我“ 512 ,
我 ) (
而( ! ( UCSRA & ( 1 “ ” UDRE ) ) ) ; / /等待串口
尿嘧啶核苷=的SPI ( 0xFF ) ; / /发送字符
)
serialterminate ( ) ;
/ /结束时,派遣2哑字节
的SPI ( 0xFF ) ; / /实际上这个回报的CRC /校验字节
的SPI ( 0xFF ) ;
返回0 ;
)
国际主要(无效) (
的init ( ) ;
SPIinit ( ) ;
uart_puts ( “单片机在线” ) ;
serialterminate ( ) ;
MMC_Init ( ) ;
uart_puts ( “三菱在线” ) ;
serialterminate ( ) ;
世( ) ; / /使中断
fillram ( ) ;
writeramtommc ( ) ;
sendmmc ( ) ;
uart_puts ( “ 512字节发送” ) ;
serialterminate ( ) ;
uart_puts ( “ LED闪光现在” ) ;
serialterminate ( ) ;
/ /输出使PD5
DDRD | = ( 1 “ ” PD5 ) ;
而( 1 ) (
/ / PIN5 PORTD明确- “率先
PORTD & = 〜 ( 1 “ ” PD5 ) ;
delay_ms ( 500 ) ;
/ / PIN5 PORTD设置- “发光二极管
PORTD | = ( 1 “ ” PD5 ) ;
delay_ms ( 500 ) ;
)
返回0 ;
)
代码来源: http://www.captain.at/electronic-atmega-mmc.php
像interrupt.h的文件和其他文件包括令人不安我。我发现其中大多数是网络
, 但就是这些文件的代码而不是十六进制文件。当我尝试编译它们的十六进制文件,我codeVision显示太多的错误。请指导我该软件
, 我使用
, 使之成为一个十六进制文件
, 如果您有任何其他工作代码的MMC与ATMEGA 16或任何其他工作代码对外部存储器然后请员额代码。我使用的ATMEGA 16 。
<img src="http://www.edaboard.com/images/smiles/icon_neutral.gif" alt="中性" border="0" />#包括<avr/io.h>
#包括<avr/interrupt.h>
#包括<avr/signal.h>
#包括<inttypes.h>
#包括<avr/iom16.h>
如果你有这些文件后
, 请他们
, 因为我不知道
, 我的文件或不正确的。