Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
Hello. I must be doing something wrong. I am just reading zeros. If anyone can offer a suggestion I would appreciate it.
some notes:
as5050.cpp
#include <mbed.h> /*! ***************************************************************************** * Reads out chip data via SPI interface * * This function is used to read out cordic value from chips supporting SPI * interface. ***************************************************************************** */ #define SPI_CMD_READ 0x8000 /*!< flag indicating read attempt when using SPI interface */ #define SPI_REG_DATA 0x7ffe /*!< data register when using SPI */ #define SPI_REG_AGC 0x7ff0 /*!< agc register when using SPI */ #define SPI_REG_CLRERR 0x6700 /*!< clear error register when using SPI */ #define u8 unsigned char #define u16 unsigned int #define ubyte unsigned char #define ushort unsigned short int #define bit unsigned char void spiReadData(); static u8 spiCalcEvenParity(ushort value); SPI spi(p5,p6,p7); DigitalOut cs(p8); ushort spiTransfer(unsigned char *data, int num_bits); Serial pc(USBTX, USBRX); // tx, rx ( the usb serial communication ) int main(void) { int loop = 4; pc.printf("\r\n\r\n"); spi.format(16,0);//16 bit data , low polarity, small delay between packets spi.frequency(100000); while(loop--) { spiReadData(); } while(1); } void spiReadData() { u16 dat; ushort angle, agcreg; ubyte agc; ushort value; bit alarmHi, alarmLo; // 16-bit data buffer for SPI communication /* Send READ AGC command. Received data is thrown away: this data comes from the precedent command (unknown)*/ dat = SPI_CMD_READ | SPI_REG_AGC; dat |= spiCalcEvenParity(dat); spiTransfer((u8*)&dat, sizeof(u16)); /* Send READ ANGLE command. Received data is the AGC value, from the precedent command */ dat = SPI_CMD_READ | SPI_REG_DATA; dat |= spiCalcEvenParity(dat); spiTransfer((u8*)&dat, sizeof(u16)); agcreg = dat; /* Send NOP command. Received data is the ANGLE value, from the precedent command */ dat = 0x0000; // NOP command. spiTransfer((u8*)&dat, sizeof(u16)); angle = dat >> 2; if (((dat >> 1) & 0x1) || ((agcreg >> 1) & 0x1)) { /* error flag set - need to reset it */ dat = SPI_CMD_READ | SPI_REG_CLRERR; dat |= spiCalcEvenParity(dat); spiTransfer((u8*)&dat, sizeof(u16)); pc.printf("error - resetting\r\n"); } else { agc = (agcreg >> 2) & 0x3f; // AGC value (0..63) value = (dat >> 2) & 0x3fff; // Angle value (0..4095 for AS5055) angle = (value * 360) / 4095; // Angle value in degree (0..359.9°) alarmLo = (dat >> 14) & 0x1; alarmHi = (dat >> 15) & 0x1; pc.printf("AGC=0x%x\r\n",agc); pc.printf("value=0x%x\r\n",value); pc.printf("angle=0x%x\r\n",angle); pc.printf("alarmLo=0x%x\r\n",alarmLo); pc.printf("alarmHi=0x%x\r\n",alarmLo); } wait(.1); } /*! ***************************************************************************** * Calculate even parity of a 16 bit unsigned integer * * This function is used by the SPI interface to calculate the even parity * of the data which will be sent via SPI to the encoder. * * \param[in] value : 16 bit unsigned integer whose parity shall be calculated * * \return : Even parity * ***************************************************************************** */ static u8 spiCalcEvenParity(ushort value) { u8 cnt = 0; u8 i; for (i = 0; i < 16; i++) { if (value & 0x1) { cnt++; } value >>= 1; } return cnt & 0x1; } ushort spiTransfer(unsigned char *data, int num_bits) { unsigned short int result =0; cs=0; result = spi.write(*data); cs = 1; // store the result *data = result; return result; }