Triple Axis Magnetometer - MMC5983MA (Qwiic)

The MMC5983MA is a highly sensitive triple axis magnetometer by MEMSIC. It is capable of sensing down to 0.4mG enabling a heading accuracy of ±0.5°. Output rates of 1000Hz, ±8G FSR, and 18-bit resolution make the MMC5983MA a phenomenal magnetic sensor for electronic compass applications.

Saturation is a problem for all mag sensors. The MMC5983MA has special built-in degaussing circuitry to clear any residual magnetization.

We've got a feature complete Arduino library supporting I2C and SPI. Just search SparkFun MMA5983MA in the library manager and get measuring within minutes.

We do not plan to regularly produce SparkX products so get them while they’re hot!

The SparkFun Qwiic Connect System is an ecosystem of I2C sensors, actuators, shields and cables that make prototyping faster and less prone to error. All Qwiic-enabled boards use a common 1mm pitch, 4-pin JST connector. This reduces the amount of required PCB space, and polarized connections mean you can’t hook it up wrong.

Experimental Product: SparkX products are rapidly produced to bring you the most cutting edge technology as it becomes available. These products are tested but come with no guarantees. Live technical support is not available for SparkX products. Head on over to our forum for support or to ask a question.
  • ±8G FSR
  • 0.25mG/0.0625mG per LSB resolution at 16bit/18bit operation mode
  • 0.4mG total RMS noise
  • Enables heading accuracy of ±0.5º
  • Max data rate of 1000Hz
  • On-chip sensitivity compensation
  • On-chip temperature sensor
  • Data_Ready Interrupt
  • I2C and SPI interfaces
  • Automotive AEC-Q100 qualified


Looking for answers to technical questions?

We welcome your comments and suggestions below. However, if you are looking for solutions to technical questions please see our Technical Assistance page.

  • I had a problem using this device in SPI mode. TL;DR: it works in SPI MODE 0 (ZERO), not in mode 3 as the datasheet states.

    That was a major waste of time and in the end I noticed that this issue was known by SparkFun, since I found the following comment in the arduino library code: (note: I am not using an arduino)

    void SFE_MMC5983MA_IO::initSPISettings() { // CPOL = 1, CPHA = 1 : SPI Mode 3 according to datasheet // In practice SPI_MODE0 is what worked. _mmcSpiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0); }

    So, how about stating this in bold capital letters in the announcement and documentation of this board? I understand that this is a MEMSIC problem, but your customers do not expect such a thing and this hits SparkFun because ultimately the board will not work if you try to write code for it from the datasheet.

    Also, for completeness for anyone reaching here, it is not necessary to cut the tracks for SPI and I2C for the device to work in SPI mode, but that is certainly a better choice than having those resistors in SPI mode.

    Regards, Marcelo.

  • Is there any documentation for the hardware interface to this MMC5983MA magnetometer? I notice there are some jumper pads for the interface protocol. Any thing on that?

    • PaulZC / about a year ago / 1

      Hi. Apologies for the slow reply. The schematic is now available on the Documents tab. You probably don't need to change the jumpers to use SPI, but the option is there if you need it. I've just tested it on ATmega328P (RedBoard) and ESP32 and it worked fine on both without changing the jumpers.

Customer Reviews

2 out of 5

Based on 2 ratings:

Currently viewing all customer reviews.

1 of 1 found this helpful:

can't get SPI to work

I purchased this MMC5983MA to be used as a compass so that I could use the SPI interface instead of the very unreliable Qwiic bus on an Arduino DUE, especially unreliable when there is more than one device on the Qwiic bus. I first got the DUE SPI interface working with a Sparkfun ZED-F9P GPS or with a NEO-M9N and they both work great on the SPI bus. When I disconnected the GPS and then connect the MMC, I cannot get it to work. I cut the SPI_CS trace to enable SPI comms as well as the I2C pull up resistors and setup a CS line on the DUE pin 6. I used the Sparkfun_MMC5983MA_Arduino_Library to get basic functionality working and it never gets past the myMag.begin(csPin) statement which just tries to see if the device is responding. I can tell that the device is being chip selected with a multimeter, but I don't have a scope to debug the comm bus further. I have tried everything I can think of and cannot get it to respond. Sparkfun provides very little guidance on the SPI bus setup for this device. The basic information provided is all about the Qwiic bus which as I stated previously, is very unreliable as it randomly hangs the bus which hangs the sketch. This is a long standing IIC problem that no one seems to be addressing. There was a recent "Wire" library update to provide a IIC bus timeout to circumvent this known problem but there is no implementation of this for the DUE. My project is for a GPS guided vehicle on the water, so reliability is a must!

No support

Asked a question on the product page with no response. Keep trying to join forum but get no confirmation email. My question is whether or not there's a hardware/software tutorial somewhere for this for basic interfacing/reading.