Part Number:TMS320F28335
您好,
自制板上使用的dsp为f28335,使用的eeprom为at25650b。现在想利用eeprom存储数据,然后现在测试dsp往eeprom读写数,或者读取AT25640B状态寄存器,AT25640B的SPi输出一直是高电平,且波形很奇怪。我的SPI的配置是这样的。
/* * SPI_EEP.c * * Created on: 2021年10月16日 *Author:*/ #include "SPI_EEP.h" void InitSpiGpio() {InitSpiaGpio(); } void InitSpiaGpio() {EALLOW;GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;// Enable pull-up on GPIO54 (SPISIMOA)GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;// Enable pull-up on GPIO55 (SPISOMIA)GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;// Enable pull-up on GPIO56 (SPICLKA) //GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;// Enable pull-up on GPIO57 (SPISTEA)GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // Asynch input GPIO16 (SPISIMOA)GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // Asynch input GPIO17 (SPISOMIA)GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // Asynch input GPIO18 (SPICLKA)GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO19 (SPISTEA)GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // Configure GPIO54 as SPISIMOAGpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // Configure GPIO55 as SPISOMIAGpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // Configure GPIO56 as SPICLKA //GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // Configure GPIO57 as SPISTEA GpioCtrlRegs.GPBMUX2.bit.GPIO57=0; GpioDataRegs.GPBSET.bit.GPIO57=1; GpioCtrlRegs.GPBPUD.bit.GPIO57=0; GpioCtrlRegs.GPBDIR.bit.GPIO57=1;EDIS; } void SPIA_Init(void) { InitSpiaGpio(); EALLOW; SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;// SPI-A EDIS; SpiaRegs.SPICCR.bit.SPISWRESET = 0; // Reset SPI SpiaRegs.SPICCR.all =0x0007;// 数据不复位,上升沿输出、下降沿输入、保留位0、禁用回还模式、传输位数8位。 SpiaRegs.SPICTL.all =0x0006;// 使能主机模式,正常相位,使能主机发送,禁止接收,溢出中断,禁止SPI中断,正常模式; SpiaRegs.SPIBRR=0x0063;//SPI波特率=375000 // SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // SpiaRegs.SPICTL.bit.CLK_PHASE=1; SpiaRegs.SPICCR.all =0x0087;// Relinquish SPI from Reset SpiaRegs.SPIPRI.bit.FREE = 0x0001;// Set so breakpoints don't disturb xmission SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Reset SPI } //uint8_t SPIA_SendReciveData(uint8_t dat) //{ // // Transmit data // SpiaRegs.SPITXBUF=dat; // // // Wait until data is received //// while(SpiaRegs.SPIFFRX.bit.RXFFST !=1); // while(SpiaRegs.SPISTS.bit.INT_FLAG !=1); // return SpiaRegs.SPIRXBUF; //} uint8_t SPIA_SendReciveData(uint8_t dat) { u8 retry=0; while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)//等待发送区空 发送缓冲区空时 SR的bit1 为1 不空的时为0 与后的结果为0,继续等待 { retry++; if(retry>200)return 0; } SpiaRegs.SPITXBUF=(dat|0x8000)<<8 ; //发送一个byte retry=0; while(SpiaRegs.SPISTS.bit.INT_FLAG != 1) { retry++; if(retry>200)return 0; } return ((SpiaRegs.SPIRXBUF)&0x00ff);//返回收到的数据 } /* * @name:eeprom_read_write_byte * @function:读取数据 * @Author: */ u8 stsss=2; //u8 eeprom_read_write_byte(u8 TxData) //{ // SpiaRegs.SPITXBUF=TxData; // // // Wait until data is received //// while(SpiaRegs.SPIFFRX.bit.RXFFST !=1); // while(SpiaRegs.SPISTS.bit.INT_FLAG==0){}; ////Delay_US(8); // DELAY_US(15); // stsss=SpiaRegs.SPISTS.bit.INT_FLAG ; // return SpiaRegs.SPIRXBUF; //} u16 eeprom_read_write_byte(u16 dat) { u8 retry=0; while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)//等待发送区空 发送缓冲区空时 SR的bit1 为1 不空的时为0 与后的结果为0,继续等待 { retry++; if(retry>200)return 0; } SpiaRegs.SPITXBUF=(dat|0x8000)<<8 ; //发送一个byte retry=0; while(SpiaRegs.SPISTS.bit.INT_FLAG != 1) { retry++; if(retry>200)return 0; } return ((SpiaRegs.SPIRXBUF)&0x00ff);//返回收到的数据 } /* * @name:eeprom_read_sr * @function:读取AT25640状态寄存器 * @Author: */ u8 temppp=0; u8 eeprom_read_sr(void) { u8 dat; eeprom_ncs; eeprom_read_write_byte(RDSR); // DELAY_US(15); dat = eeprom_read_write_byte(0x00); eeprom_cs; temppp=dat; return dat; } /* * @name:eeprom_write_byte * @function:写入一个数据 * @Author: */ u8 ddd=0; void eeprom_write_byte(u16 addr,u8 Dat)//没有问题 { unsigned char Add; // ddd=eeprom_read_sr()&RDY; // while(eeprom_read_sr()&RDY);//等待就绪信号 // while(0);//等待就绪信号 eeprom_ncs;//片选 eeprom_read_write_byte(WREN);//启用数据写入状态 eeprom_cs; eeprom_ncs; if(addr>0x00ff) eeprom_read_write_byte((WRITE|0x08)); else eeprom_read_write_byte(WRITE); Add = (unsigned char)(addr & 0x00); eeprom_read_write_byte(Add); eeprom_read_write_byte(Dat); eeprom_cs; } /* * @name:eeprom_read_byte * @function:读取一个字节 * @Author: */ u8 eeprom_read_byte(u16 addr)//没有问题 { u8 dat,add; // while(eeprom_read_sr()&RDY); // while(0);//等待就绪信号 eeprom_ncs; if(addr>0x00ff) eeprom_read_write_byte((READ | 0x08)); else eeprom_read_write_byte(READ); add = (unsigned char)(addr & 0x00); eeprom_read_write_byte(add); dat=eeprom_read_write_byte(0x00); eeprom_cs; return dat; } /* * @name:eeprom_read_write_byte * @function:连续写入数据 * @Author: */ void eeprom_write_buf(u16 startAddr,u8 *buf,u16 count) { u16 i; while(eeprom_read_sr()&RDY); eeprom_ncs; eeprom_read_write_byte(WREN); eeprom_cs; eeprom_ncs; eeprom_read_write_byte(WRITE); eeprom_read_write_byte(startAddr>>8); eeprom_read_write_byte(startAddr); for(i=0;i<count;i++) { eeprom_read_write_byte(*buf++); } eeprom_cs; } /* * @name:eeprom_write_nbyte * @function:连续写入n字节数据 * @Author: */ void eeprom_write_nbyte(u16 startAddr,u8 *buf,u16 count) { u16 pageTotal=count/64; u16 pageResidue=count%64; u16 i; u16 pageCnt=0; for(i=0;i<pageTotal;i++) { eeprom_write_buf(startAddr+pageCnt,&buf[pageCnt],64); pageCnt+=64; } eeprom_write_buf(startAddr+pageCnt,&buf[pageCnt],pageResidue); } /* * @name:eeprom_read_buf * @function:连续读取数据 * @Author: */ void eeprom_read_buf(u16 startAddr,u8 *buf,u16 count) { unsigned int i; while(eeprom_read_sr()&RDY); eeprom_ncs; eeprom_read_write_byte(READ); eeprom_read_write_byte(startAddr>>8); eeprom_read_write_byte(startAddr); for(i=0;i<count;i++) { *buf++ = eeprom_read_write_byte(0x00); } eeprom_cs; }
Green Deng:
你好,抱歉没有使用SPI读取外部EEPROM的经验,这里有一个F28377的SPI读取EEPROM帖子包含程序,可以参考一下
但是我看你的描述似乎两款芯片通讯都没有建立起来啊,有没有检查过硬件上是否有问题?
另外,建议你直接前往英文E2E论坛,看看那边的TI工程师是否有相关经验可以参考的:e2e.ti.com/…/c2000-microcontrollers-forum
,
Wei Qi:
你好,请问F28377的SPI读取EEPROM帖子包含程序的链接可以发一下吗,我找不到
,
Green Deng:
你好,你是在E2E中文论坛看到的吗?是其他工程师分享的帖子?有印象帖子的标题大概是什么吗?