共2条
1/1 1 跳转至页
45DB081 45DB081接口的例子
问
哪位兄弟有用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;
}
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |