Hi,
I am trying to interface ADC-cs5463 with P89v51rd2 micro controller using "bit banging SPI" code but not getting any result.
I am using below code if any one can see the code and if i am making some mistake or doing wrong than reply me.
Please help me to find the problem.
#include "p89v51rx2.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h>
//-----------------------------------ADC CS5463------------------ sbit nreset = P3^3; //RESET PIN OF CS5463 sbit cs = P3^4; //CHIP SELECT OF CS5463 sbit sclk = P3^7; //SERIAL CLOCK sbit sdo = P3^6; //SERIAL DATA OUT sbit sdi = P3^5; //SERIAL DATA IN
unsigned char sec_cnt=0; unsigned long longVar=0;
unsigned char mdatahigh; unsigned char mdatamid; unsigned char mdatalow;
//--------------------- Functions Related to CS5463 --------------------------------- void init_cs5463(void);
void main(void) {
init_cs5463();//initiallises the cs to function as per our requirements
}
void init_cs5463(void) {
write_to_reg(0x40,PCB,0x80,0x61); //write to config register(0x40)
cs=0;
transfer_byte(0xe8); // start continuous conversions..
cs=1;
//Here is my while loop and try to read the CS5463 register and disply it,but not able //to get any response from the it.
longVar = 0;
while(1)
{
read_a_reg(0x40,(unsigned char *)&longVar);
float2str(longVar,&disp_buffer[4],0);
float2str(mdatahigh,&disp_buffer[16],0);
float2str(mdatamid,&disp_buffer[19],0);
float2str(mdatalow,&disp_buffer[22],0);
void transfer_byte(unsigned char datum) {
unsigned char count,tempbyte;
sclk=0;
tempbyte=0x80;
for(count=0;count<8;count++) {
if(datum & tempbyte) {
sdi=1;
else {
sdi=0;
sclk=1;
tempbyte=tempbyte>>1;
delay(10);
unsigned char receive_byte(void) {
unsigned char count,tempbyte,datal;
datal=0x80;
tempbyte=0;
sdo=1;
if(sdo) {
tempbyte|=datal;
} sclk=1;
datal=datal>>1;
return(tempbyte);
void read_a_reg(unsigned char command,unsigned char * ptr) {
transfer_byte(command);
mdatahigh=receive_byte();
mdatamid=receive_byte();
mdatalow=receive_byte();
*ptr=mdatalow;
ptr++;
*ptr=mdatamid;
*ptr=mdatahigh;
void write_to_reg(unsigned char command,unsigned char high,unsigned char mid,unsigned char low) {
transfer_byte(high);
transfer_byte(mid);
transfer_byte(low);
Why does the "urgency" seem to have disappeared...?
somebody have on chip spi code for 89v51rd2 than pls share.
Thanks in advance.
With the high intensity put into solving problems with the above code, I have to kind of suspect that the bitbanged code was the first code "found" somewhere. And when it didn't work, then the OP got stuck. So now it's time to try to find code making use of the SPI device.
But whatever code is used, it's still important to figure out what is needed regarding timing, configuration, ... Debugging is always needed when implementing programs. How else can it be verified that the code does as expected and that all requirements specified in the datasheets are fulfilled?
My thoughts exactly.
I guess (s)he could not find "webcode" for the HW SPI and thus chose the "clumsy" solution of bit-banging when HW SPI is available on the chip.
Erik
Guess he/she didn't even consider hardware SPI until this thread started to ask about it.
Why you all people experts-authors are passing time on comment to other thing...why not think or write solution of my problem??
I didn't find any single person who had see my code and give any comment on it...i got comment on align meant...!!! hey you all why not focus on problem and try to solve it....right??
I know it had on chip module of spi...but i didn't have any reference code of it...right??
people talk about on chip spi but no body give reference code or any link which guide me....right??
I think this forum is useless....there is no focus on solving the problem...but here people like to only discuss it.
You should always take care to understand the purpose of a forum before posting.
The purpose of this forum is clearly stated here: http://www.keil.com/forum/
"The Keil Discussion Forum is an open forum where you may post questions and comments about Keil products."
It is not a free consultancy service.
It is not a place where people will do your homework for you.
If you want someone to do your work for you, then you should be posting on sites like these:
" href= "http://www.zintro.com">http://www.zintro.com
Or try http://www.keil.com/condb
"I didn't find any single person who had see my code and give any comment on it"
Then you must be blind!
You have been given plenty of pointers for where you should be focussing your debugging attention:
* That the IO pins are actually working;
* The SPI phase and polarity;
* Timing;
* Correct handling of received data.
The amount of help given normally depends on the amount of feedback we receive. We know that people who don't give any feedback will probably not listen to what we write. So we don't give any more help.
You have not given any feedback in this thread. So why should we try to remote-debug something if we don't feel that you are an active termination on the other end of this communications link?
We don't know if you have read the datasheet yet, because of the lack of feedback? Have you tried resynchronize the port? Have you considered the Auto-boot sequence? Have you compared your signals with the SDI Write Timing and SDO Read Timing in the datasheet?
throw the code out and use the Hardware SPI interface
(possibly with minor modifications) the SPI code generated by the CodeArchitect (free from http://www.esacademy.com) for the LPC936 will, most likely, work for the RD2. Compare the datasheets, the chance is so great that it is 10 times worth the effort.
That would require some study of two datasheets...
sure, an excellent excesize for a beginner. Anyhow the SPI chapter will not be HUGE