这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 45DB081 45DB081接口的例子

共2条 1/1 1 跳转至

45DB081 45DB081接口的例子

院士
2006-09-17 18:14:16     打赏
45DB081 45DB081接口的例子



关键词: 45DB081     接口     例子    

院士
2006-12-22 22:43:00     打赏
2楼
问 哪位兄弟有用MSP430F14X与45DB081接口的例子,采用IO口模拟SPI接口总线的,请发给我一份。我自己写的代码不好用,老是有问题
steelen126.com 1: 没有地址怎么发? 2: 引用: 3: 给我发一份
zzm512sin163.com 4: //*********************************************************************
//
//
// MSP430F1611
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|- ____________
// | | | |
// | P3.3|-->|SCLK A |
// | P3.2| . |SO T |
// | P3.1| . |SI 4 |
// | P3.0| . |RDY 5 |
// | P2.3| . |RESET D |
// | VCC | . |WP B |
// | P2.2|-->|CS 0 |
// | | | 4 |
// | | | 1 |
// |____________|
//**********************************************************************

#include "devices.H"
#include "iic.h"
#include "dataFlash.h"
#include "includes.h"
// 操作命令表
#define DF_STATE_CMD 0x57 // 读状态寄存器
#define DF_WRITE_BF_1_CMD 0x84 // 写Buffer1
#define DF_WRITE_BF_2_CMD 0x87 // 写Buffer2
#define DF_READ_BF_1_CMD 0x54 // 读Buffer1
#define DF_READ_BF_2_CMD 0x56 // 读Buffer2

#define DF_BF_WRITE_1_CMD 0x83 // 带擦除Buffer1到主存
#define DF_BF_WRITE_2_CMD 0x86 // 带擦除Buffer1到主存

#define DF_DIRECT_READ_FLSH_CMD 0x52 // 直接读主存

// 检测DataFlash状态,忙,返回1,空闲返回0
int df_test_busy(void);
//
// 传输一个字节数据,传入要发送的数据cData,返回同时返回一个数据
char df_traByte(char cData);
// Buffer与主存之间的操作
int df_buffer_write_flash(char cmd, unsigned int page_address);

// 根据传入的命令,对buffer进行读、写操作
extern int df_buffer_tr(unsigned char cmd, char *p_data, unsigned int offset, unsigned int lenght);

// CS脚接P2.2
#define DF_CS BIT2
// SCLK -- P3.3
#define DF_SCLK BIT3
// SI -- P3.1
#define DF_SI BIT1
// SO -- P3.2
#define DF_SO BIT2
// RDY -- P3.0
#define DF_RDY BIT0
// WP -- VCC

// RESET -- P2.3
#define DF_RESET BIT3

#define DF_RESET_1 P2OUT |= DF_RESET
#define DF_RESET_0 P2OUT &= ~DF_RESET
#define DF_CS_1 P2OUT |= DF_CS
#define DF_CS_0 P2OUT &= ~DF_CS

#define DF_SCLK_1 P3OUT |= DF_SCLK
#define DF_SCLK_0 P3OUT &= ~DF_SCLK

#define DF_SI_1 P3OUT |= DF_SI
#define DF_SI_0 P3OUT &= ~DF_SI

void df_init(void)
{
// 采用模拟三线 SPI 方式 0 时序方式与DataFlash通讯

P3DIR |= DF_SCLK + DF_SI;
P3DIR &= ~(DF_SO + DF_RDY);
P3SEL &= ~(DF_SCLK + DF_SI + DF_SO);
P3OUT &= ~DF_SCLK;

P2DIR |= DF_CS + DF_RESET;
P2SEL &= ~(DF_CS + DF_RESET);
P2OUT |= DF_CS + DF_RESET;

df_reset();
}

// 复位DataFlash
void df_reset(void)
{
unsigned int i = 0;

DF_RESET_1;
DF_CS_0;
delay(10);
DF_RESET_0;
// 延时10uS 以上,复位DataFlash
for(i = 0; i < 0x1ff; i++);
{
_NOP();
}
DF_CS_1;
delay(10);
DF_RESET_1;
DF_CS_0;
delay(10);
DF_CS_1;
}

int df_test_busy(void)
{
if((P3IN & DF_RDY))
return 0;

return 1;
}

// 传输一个字节数据,传入要发送的数据cData,返回同时返回一个数据
char df_traByte(char cData)
{ // 收到的数据
unsigned char cRData = 0;
unsigned int count = 8;
while(count)
{ // 发送数据, 高位在前,低位在后

cRData <<= 1;
if(cData & BIT7)
{
DF_SI_1;
}else
{
DF_SI_0;
}
//送时钟
DF_SCLK_1;
DF_SCLK_0;
// 接收数据
if(P3IN & DF_SO)
{ // 收到数据 1
cRData += 1;
}else
{
_NOP();
}
count--;
cData <<= 1;
}
return (cRData);
}


int df_read_state(void)
{
char cRData = 0;
DF_SCLK_0;
DF_CS_0;
_NOP();
df_traByte(DF_STATE_CMD);
cRData = df_traByte(0xFF);
_NOP();
DF_CS_1;
return cRData;
}

int df_buffer_tr(unsigned char cmd, char *p_data, unsigned int offset, unsigned int lenght)
{
unsigned int i = 0x1fff;
while((i > 0) && (df_test_busy()))
{// 软件超时,防止阻塞
i--;
}
if(i == 0) return 0; // 芯片忙
/*
if((lenght - offset) > DF_ONE_PAGE_BYTES)
{ // 防止数据长度超出页边界
lenght = DF_ONE_PAGE_BYTES - offset + 1;
}
*/
DF_SCLK_0;
DF_CS_0;
_NOP();
df_traByte(cmd);
df_traByte(0x00); // 无关位
df_traByte((char)(offset >> 8)); // 缓冲buffer偏移地址
df_traByte((char)(offset));

switch(cmd)
{
case DF_WRITE_BF_1_CMD:
case DF_WRITE_BF_2_CMD:
{// 写入缓存
while(lenght)
{
df_traByte(*p_data);
lenght--;
p_data++;
}
DF_CS_1;
}break;

case DF_READ_BF_1_CMD:
case DF_READ_BF_2_CMD:
{// 从缓存读取数据
df_traByte(0x00);
while(lenght)
{
*p_data = df_traByte(0xff); // 发送无关数据,以接收数据
lenght--;
p_data++;
}
_NOP();
DF_CS_1;
}break;

default :
_NOP();
DF_CS_1;
return 0;
}
return 1;
}

// Buffer与主存之间的操作
int df_buffer_write_flash(char cmd, unsigned int page_address)
{
unsigned int i = 0x1fff;
while((i > 0) && (df_test_busy()))
{// 软件超时,防止阻塞
i--;
}
if(i == 0) return 0; // 芯片忙
DF_SCLK_0;
DF_CS_0;
_NOP();
df_traByte(cmd);

df_traByte((char)(page_address >> 7)); // 缓冲buffer偏移地址
df_traByte((char)(page_address << 1));
df_traByte(0x00); // 无关位
_NOP();
DF_CS_1;
return 1;
}

//***************************************************
// 写一页内容到DataFlash
// 先写缓存,然后启动带擦除的缓存到主存方式写入
//***************************************************
int df_buffer_write_page(const char *p_source, unsigned int page_address, unsigned int page_offset, unsigned int lenght)
{
/*
//char c = df_read_state();
if(df_buffer_tr(DF_WRITE_BF_1_CMD, (char*)p_source, page_offset, lenght))
{
if(df_buffer_write_flash(DF_BF_WRITE_1_CMD, page_address))
return 1;
}
*/
char c = df_read_state();
if(!(c&BIT7))return 0;
DF_SCLK_0;
DF_CS_0;
df_traByte(0x82);
df_traByte((char)(page_address >> 7)); // 页地址PA11-PA7
df_traByte((char)((page_address << 1) | (page_offset >> 8))); // 页地址PA6-PA0 ,页内偏移BA8
df_traByte((char)(page_offset));
while(lenght--)
{
df_traByte(*p_source++);
}
DF_CS_1;

delay(65535);
return 1;
}


int df_direct_read_page(char *p_dest, unsigned int page_address, unsigned int page_offset, unsigned int lenght)
{
unsigned int i = 0x1fff;
//df_reset();
while((i > 0) && (df_test_busy()))
{// 软件超时,防止阻塞
i--;
}
if(i == 0) return 0; // 芯片忙
DF_SCLK_0;
DF_CS_0;
_NOP();
df_traByte(DF_DIRECT_READ_FLSH_CMD);
df_traByte((char)(page_address >> 7)); // 页地址PA11-PA6
df_traByte((char)((page_address << 1) | (page_offset >> 8))); // 页地址PA5-PA0 ,页内偏移BA9-BA8
df_traByte((char)(page_offset));
df_traByte(0x00);
df_traByte(0x00);
df_traByte(0x00);
df_traByte(0x00);

while(lenght)
{
*p_dest = df_traByte(0xff);
lenght--;
p_dest++;
}
_NOP();
DF_CS_1;
//delay(65535);
return 1;
}

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]