Всем привет...
давно пытаюсь создать вав плейер на attiny85 и DataFlash AT45DBxxxx
Много мучался со чтением с этотго еепрома...получилось...функции для чтения 100% рабочие
есть проблемы с воспроизведением, т.е. кидать всё это дело в шим...
если кто-то сталкивался...может поможете???
заранее благодарен
Код:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include "AT45DB161D_opcodes.h"
#define Sampl_freq 44100
#define F_CPU 20000000
unsigned char df_BufferNum;
unsigned char df_Read_BufferNum;
unsigned int df_BufferIdx;
unsigned int df_Read_BufferIdx;
unsigned int df_PageAdr;
unsigned int df_Read_PageAdr;
unsigned char df_Read_END;
unsigned char df_Stop_Write;
//----------
unsigned char spi_transfer(unsigned char mydata)
{
unsigned char temp;
USIDR = mydata;
mydata = 0x11;
temp = 0x13;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
return (USIDR);
}
//----------
void Init(void)
{
PORTB = (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(0<<PB4);
DDRB = (0<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4);
MCUSR = 0;
PLLCSR = 0b00000110; /* Select PLL clock for TC1.ck */
GTCCR = 0b01000000; /* Enable TC1.OCB as PWM out (L-ch) */
TCCR1 = 0b01000001; /* Start TC1 with TC1.OCA is enabled as PWM out (R-ch) */
TCCR0A = 0b00000010; /* Enable TC0.ck = 2MHz as interval timer */
TCCR0B = 0b00000010;
TIMSK = (1<<OCIE0A);
OCR0A = (unsigned char)(F_CPU / 8 / Sampl_freq );
asm("sei");
df_Read_END=false;
dataflash_CS_inactive(); //disable device
}
//----------
void dataflash_CS_inactive()
{
PORTB = _BV(PB3);//digitalWrite(DF_SLAVESELECT,HIGH); //disable device
}
//----------
void dataflash_CS_active()
{
PORTB = ~_BV(PB3);//digitalWrite(DF_SLAVESELECT,LOW); //enable device
}
//----------
unsigned char ReadStatus(void)
{
unsigned char tmp;
dataflash_CS_inactive(); // Reset dataflash command decoder
dataflash_CS_active();
// Read status command
spi_transfer(DF_STATUS_REGISTER_READ);
tmp = spi_transfer(0x00);
return(tmp&0x80); // We only want to extract the READY/BUSY bit
}
//----------
void PageToBuffer(unsigned char BufferNum, unsigned int PageAdr)
{
dataflash_CS_inactive();
dataflash_CS_active();
if (BufferNum==1)
spi_transfer(DF_TRANSFER_PAGE_TO_BUFFER_1);
else
spi_transfer(DF_TRANSFER_PAGE_TO_BUFFER_2);
spi_transfer((unsigned char)(PageAdr >> 6));
spi_transfer((unsigned char)(PageAdr << 2));
spi_transfer(0x00); // don?t care bytes
dataflash_CS_inactive(); //initiate the transfer
dataflash_CS_active();
while(!ReadStatus()); //monitor the status register, wait until busy-flag is high
}
//----------
unsigned char BufferRead (unsigned char BufferNum, unsigned int IntPageAdr)
{
unsigned char tmp;
dataflash_CS_inactive(); // Reset dataflash command decoder
dataflash_CS_active();
if (BufferNum==1)
spi_transfer(DF_BUFFER_1_READ);
else
spi_transfer(DF_BUFFER_2_READ);
spi_transfer(0x00); //don't cares
spi_transfer((unsigned char)(IntPageAdr>>8)); //upper part of internal buffer address
spi_transfer((unsigned char)(IntPageAdr)); //lower part of internal buffer address
spi_transfer(0x00); //don't cares
tmp = spi_transfer(0x00); //read data byte
return (tmp);
}
//----------
void WaitReady()
{
while(!ReadStatus());
}
//----------
void StartRead(int PageAdr)
{
df_Read_BufferNum=1;
df_Read_BufferIdx=0;
df_Read_PageAdr=PageAdr;
WaitReady();
PageToBuffer(df_Read_BufferNum,df_Read_PageAdr); // Write Memory page to buffer
df_Read_PageAdr++;
}
//----------
unsigned char ReadByte()
{
unsigned char result;
WaitReady();
result = BufferRead(df_Read_BufferNum,df_Read_BufferIdx);
df_Read_BufferIdx++;
if (df_Read_BufferIdx >= 512) // End of buffer?
{
df_Read_BufferIdx=0;
PageToBuffer(df_Read_BufferNum,df_Read_PageAdr); // Write memory page to Buffer
df_Read_PageAdr++;
if (df_Read_PageAdr>=4096) // If we reach the end of the memory, start from the begining
{
df_Read_PageAdr = 0;
df_Read_END = true;
}
}
return result;
}
//----------
ISR(TIMER1_COMPA_vect) {
unsigned char temp;
temp = ReadByte();
OCR1B = temp;
}
//----------
void main(void)
{
Init();
}
AT45DB161D_opcodes.h
Код:
// AT45DB161D Commands (from Datasheet)
#define DF_TRANSFER_PAGE_TO_BUFFER_1 0x53
#define DF_TRANSFER_PAGE_TO_BUFFER_2 0x55
#define DF_STATUS_REGISTER_READ 0xD7
#define DF_READ_MANUFACTURER_AND_DEVICE_ID 0x9F
#define DF_PAGE_READ 0xD2
#define DF_BUFFER_1_READ 0xD4
#define DF_BUFFER_2_READ 0xD6
#define DF_BUFFER_1_WRITE 0x84
#define DF_BUFFER_2_WRITE 0x87
#define DF_BUFFER_1_TO_PAGE_WITH_ERASE 0x83
#define DF_BUFFER_2_TO_PAGE_WITH_ERASE 0x86
#define DF_PAGE_ERASE 0x81
#define DF_BLOCK_ERASE 0x50
#define DF_SECTOR_ERASE 0x7C
#define DF_CHIP_ERASE_0 0xC7
#define DF_CHIP_ERASE_1 0x94
#define DF_CHIP_ERASE_2 0x80
#define DF_CHIP_ERASE_3 0x9A
#define false 0
#define true 1