楼主
发表于 2010-7-25 20:49
| 只看该作者
请帮我看看PIC与X5045的程序问题在哪?
这个程序师从51上移植过来的SPI的协议时测试通过的,但是调了很久就是没有把它弄出来,期间改变晶振大小,调整端口输出位,硬件也检查了很多次,器件是在51板上测试过的,确实找不到问题在哪里,希望请高人相助!- //模拟SPI总线方式与X5045的EEPROM的读写
- //主程序中通过byte_write(6,6)将数据写入地址6中,通过ee_date[0]= byte_read(6);读出数据
- //由display();输出ee_date[0]中的数据到LED上
- //单片机采用PIC16F877A,测试X5045数据读写失败(LED一直显示0000),注此程序在51系列单片机测试通过的。
- #include<pic.h>
- __CONFIG(0x1832);
- //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
-
- /* #define c_s RC2
- #define clk RC3
- #define d_i RC5
- #define d0 RC4 */
- #define ee_addr 0x5
- #define nop() asm("nop")
- const char ee_data_write[]={0x56,0x78};
- unsigned char ee_date[4];
- const char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
- void init();
- void display();
- void delay();
- #define uchar unsigned char
- #define uint unsigned int
- //x5045和51的连接方法
- #define CS RC2
- #define SO RC4
- #define SI RC5
- #define SCK RC3
- //定义寄存器指令
- #define WREN 0x06 // 写入使能指令(WREN)
- #define WRDI 0x04 // 写入禁止指令(WRDI)
- #define WRSR 0x01 // 写入状态寄存器指令(WRSR)
- #define RDSR 0x05 // 读取状态寄存器指令(RDSR)
- #define WRITE 0x02 // 写入存储器指令(WRITE)
- #define READ 0x03 // 读取存储器指令(READ)
- #define nop() asm("nop")
-
- #define STATUS_REG 0x00 // 要写入到状态寄存器的值
- #define MAX_POLL 0x99 // 最在查询次数m number of
- void outbyt(unsigned char write_data)
- {
- unsigned char i;
- for(i = 0; i < 8; i++)
- {
- SCK = 0;
- SI = (bit)(write_data & 0x80); //传送一个位到SI
- write_data <<= 1;
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- SCK = 1;
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- }
- SI = 0;
- }
- unsigned char inbyt()
- {
- unsigned char i;
- unsigned char read_data=0;
- for(i = 0; i < 8; i++)
- {
- SCK = 0;
- read_data <<= 1;
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- SCK = 1;
- read_data |= (unsigned char)SO;
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- }
- return read_data;
- }
- void wren_cmd()
- {
- CS = 0;
- outbyt(WREN); // 传送写入使能指令
- CS = 1;
- }
- void wrdi_cmd()
- {
- CS = 0;
- outbyt(WRDI); // 传送写入禁止指令
- CS = 1;
- }
- unsigned char rdsr_cmd()
- {
- unsigned char status;
- CS = 0;
- outbyt(RDSR); // 传送状态寄存器读取指令
- status = inbyt(); // 读取状态寄存
- CS = 1;
- return status;
- }
- void wip_poll()
- {
- unsigned char i; // 设置最大的查询次数
- //// 如果WIP位为'1'并且未达到最大查询次数, 则继续查询
- //// 如果WIP位为'0', 则写入周期完成, 返回
- for(i = 0; i < MAX_POLL; i++)
- {
- if(rdsr_cmd() & 0x01) // 读取状态寄存器
- {
- continue;
- }
- return;
- }
- }
- void wrsr_cmd()
- {
- CS = 0;
- outbyt(WRSR); // 传送状态寄存器写入指令
- outbyt(STATUS_REG); // 传送要写入的数据
- CS = 1;
- wip_poll(); // 检测写入进度
- }
- void byte_write(unsigned int addr,unsigned char dat)
- {
- wren_cmd();
- CS = 0;
- if(addr & 0x100)
- outbyt(WRITE | 0x08); //传送写入指令和地址最高位"1"
- else
- outbyt(WRITE); // 传送写入指令和地址最高位"0"
- outbyt(addr); // 传送地址低字节
- outbyt(dat); // 传送数据字节
- CS = 1;
- wip_poll(); // 检测写入进度
- }
- unsigned char byte_read(unsigned int addr)
- {
- unsigned char read_data;
- CS = 0;
- if(addr & 0x100)
- outbyt(READ | 0x08);// 传送读取指令和地址最高位"1"
- else
- outbyt(READ); // 传送读取指令和地址最高位"0"
-
- outbyt(addr); // 传送地址低字节
- read_data = inbyt(); // 读取字节
- CS = 1;
- return read_data;
- }
- void rst_wdog()
- {
- CS = 0;
- _nop_();_nop_();
- CS = 1;
- }
- void main()
- {
- init();
- while(1)
- {
- byte_write(6,6);
- delay();
- // byte_write(9,9);
- delay();
- ee_date[0]= byte_read(6);
- // ee_date[1]= byte_read(9);
- display();
- }
- }
- void init()
- {
- OPTION=0;
- ADCON1=0X07;
- TRISA=0X30;
- TRISB=0X03;
- TRISC=0X10;
- TRISD=0X00;
- // PORTD=0XFF;
- SSPSTAT=0X80;
- SSPCON=0X31;
- INTCON=0X00;
- PIR1=0X00;
- CS=0;
- }
- void display()
- {
- int i;
- i=ee_date[0]&0xf0;
- i=i>>4;
- PORTD=table;
- PORTA=0x37;
- delay();
- i=ee_date[0]&0x0f;
- PORTD=table;
- PORTA=0x3b;
- delay();
-
- i=ee_date[1]&0xf0;
- i=i>>4;
- PORTD=table;
- PORTA=0x3d;
- delay();
- i=ee_date[1]&0x0f;
- PORTD=table;
- PORTA=0x3e;
- delay();
- }
- void delay()
- {
- int i;
- for(i=100;i>0;i--);
- }
复制代码 |
社区口号:开发路上不能单打独斗,帮助需要帮助的人,是对帮助过你的人最大的感谢! |